劍指Offer-鏈表中倒數第k個結點
阿新 • • 發佈:2017-08-18
== fin isp 長度 bre turn k個結點 nod ota
題目:
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
思路1:
- 使用指針遍歷鏈表,得到鏈表的長度len;
- 將指針指向鏈表頭部,向後移動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 intView Codek) { 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 };
思路2:
- 使用兩個指針,第一個指針向前移動k-1個節點,到達第k個節點;
- 第二個指針和第一個指針同時開始移動,當第一個指針到達鏈表末尾時,第二個指針位於倒數第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個結點