1. 程式人生 > >劍指Offer-鏈表中倒數第k個結點

劍指Offer-鏈表中倒數第k個結點

== fin isp 長度 bre turn k個結點 nod ota

題目:

輸入一個鏈表,輸出該鏈表中倒數第k個結點。

思路1:

  1. 使用指針遍歷鏈表,得到鏈表的長度len;
  2. 將指針指向鏈表頭部,向後移動len-k+1個長度,得到倒數第k個節點。

代碼1:

技術分享
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* FindKthToTail(ListNode* pListHead, unsigned int
k) { 12 ListNode *newphead = pListHead; 13 int total = 0; 14 while(newphead != NULL){ 15 total++; 16 newphead = newphead->next; 17 } 18 newphead = pListHead; 19 int flag = total-k+1; 20 total = 0; 21 ListNode *result;
22 while(newphead != NULL){ 23 total++; 24 if(total == flag){ 25 result = newphead; 26 break; 27 } 28 newphead = newphead->next; 29 } 30 return result; 31 } 32 };
View Code

思路2:

  1. 使用兩個指針,第一個指針向前移動k-1個節點,到達第k個節點;
  2. 第二個指針和第一個指針同時開始移動,當第一個指針到達鏈表末尾時,第二個指針位於倒數第k個節點上。

代碼2:

技術分享
 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
12         if(pListHead == NULL )
13             return pListHead;
14         ListNode *p1 = pListHead;
15         ListNode *p2 = pListHead;
16         int step = 1;
17         while(step <= k){
18             if(p1->next != NULL)
19                 p1 = p1->next;
20             else{
21                 if(step == k)
22                     return p2;
23                 else
24                     return NULL;
25             }
26             step += 1;
27         }
28         while(p1 != NULL){
29             p1 = p1->next;
30             p2 = p2->next;
31         }
32         return p2;
33     }
34 };
View Code

劍指Offer-鏈表中倒數第k個結點