您的位置:首页 > 其它

链表中倒数第K个节点

2016-03-28 20:56 260 查看
题目描述:

  输入一个链表,输出该链表中倒数第k个结点。

算法思想:

  这种题型应该见过的,一般只要的涉及倒数。我们就需要设置两个指针了。这道题我们需要设置两个指针,先让一个指针向前移动k-1个位置(保持两个指针之间的距离为k-1),然后让第二个指针指向头结点,之后让两个指针同时向后移动,直到前边的指针指向NULL ,返回后边的指针即可。这样我们就扫描一遍的情况下找到了结果。

  针对这种方法我们还可以解决像求链表的中间节点,求单向链表是否有环等;我们的解决办法就是让一个指针速度快一些(比如一次走两步)或者先让他走若干步即可;

算法实现:

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef struct ListNode{
int data;
struct ListNode *next;
}ListNode;

ListNode *FindKey(ListNode *pHead, int k){
if(pHead == NULL || k == 0){             //当输入的k<0或者头指针为空时,返回NULL
return NULL;
}

ListNode *head = pHead;
ListNode *index = NULL;

for(int i = 0; i < k - 1; ++i){
if(head->next != NULL){                  //当链表元素不足k个时,返回NULL
head = head->next;
}
else{
return NULL;
}
}
index = pHead;
while(head->next != NULL){
head = head->next;
index = index->next;
}
return index;
}

ListNode *CreateList(int x){                              //创建链表
long num;
ListNode *pHead = NULL;
ListNode *p = NULL;

while(x-- > 0){
cin>>num;
ListNode* pNew = new ListNode();
if(pNew == NULL){
exit(EXIT_FAILURE);
}
pNew->data = num;
pNew->next = NULL;

if(pHead == NULL)
{
pHead = pNew;
p = pHead;
}
else
{
p->next = pNew;
p = p->next;
}
}
return pHead;
}

int main(){
int n, k;
ListNode *result = NULL;

while(cin>>n>>k){
ListNode *pNode = CreateList(n);
result = FindKey(pNode, k);
if(result == NULL){
cout<<"NULL"<<endl;
}
else{
cout<<result->data<<endl;
}
}

return 0;
}
/**************************************************************
Problem: 1517
User: 。。。。。。
Language: C++
Result: Accepted
Time:190 ms
Memory:3104 kb
****************************************************************


参考书籍:

《剑指offer》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: