链表中倒数第K个节点
题目描述:
输入一个链表,输出该链表中倒数第k个结点。
算法思想:
这种题型应该见过的,一般只要的涉及倒数。我们就需要设置两个指针了。这道题我们需要设置两个指针,先让一个指针向前移动k-1个位置(保持两个指针之间的距离为k-1),然后让第二个指针指向头结点,之后让两个指针同时向后移动,直到前边的指针指向NULL ,返回后边的指针即可。这样我们就扫描一遍的情况下找到了结果。
针对这种方法我们还可以解决像求链表的中间节点,求单向链表是否有环等;我们的解决办法就是让一个指针速度快一些(比如一次走两步)或者先让他走若干步即可;
算法实现:
1 #include<iostream> 2 #include<stdlib.h> 3 using namespace std; 4 5 typedef struct ListNode{ 6 int data; 7 struct ListNode *next; 8 }ListNode; 9 10 ListNode *FindKey(ListNode *pHead, int k){ 11 if(pHead == NULL || k == 0){ //当输入的k<0或者头指针为空时,返回NULL 12 return NULL; 13 } 14 15 ListNode *head = pHead; 16 ListNode *index = NULL; 17 18 for(int i = 0; i < k - 1; ++i){ 19 if(head->next != NULL){ //当链表元素不足k个时,返回NULL 20 head = head->next; 21 } 22 else{ 23 return NULL; 24 } 25 } 26 index = pHead; 27 while(head->next != NULL){ 28 head = head->next; 29 index = index->next; 30 } 31 return index; 32 } 33 34 ListNode *CreateList(int x){ //创建链表 35 long num; 36 ListNode *pHead = NULL; 37 ListNode *p = NULL; 38 39 while(x-- > 0){ 40 cin>>num; 41 ListNode* pNew = new ListNode(); 42 if(pNew == NULL){ 43 exit(EXIT_FAILURE); 44 } 45 pNew->data = num; 46 pNew->next = NULL; 47 48 if(pHead == NULL) 49 { 50 pHead = pNew; 51 p = pHead; 52 } 53 else 54 { 55 p->next = pNew; 56 p = p->next; 57 } 58 } 59 return pHead; 60 } 61 62 int main(){ 63 int n, k; 64 ListNode *result = NULL; 65 66 while(cin>>n>>k){ 67 ListNode *pNode = CreateList(n); 68 result = FindKey(pNode, k); 69 if(result == NULL){ 70 cout<<"NULL"<<endl; 71 } 72 else{ 73 cout<<result->data<<endl; 74 } 75 } 76 77 return 0; 78 } 79 /************************************************************** 80 Problem: 1517 81 User: 。。。。。。 82 Language: C++ 83 Result: Accepted 84 Time:190 ms 85 Memory:3104 kb 86 ****************************************************************
参考书籍:
《剑指offer》