链表中倒数第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》

posted @ 2016-03-28 20:56  Dormant  阅读(408)  评论(0编辑  收藏  举报