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

劍指offer編程-鏈表中倒數第k個結點

描述 節點 thead 註意 功能測試 判斷 tro return 測試用例

題目描述

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

思路:

1.遍歷鏈表得到鏈表的長度l,找到從前往後的第l-k+1個節點。需要遍歷兩遍。 2.遍歷一次即可的方法:兩個指針,第一個指針從頭向尾移動k-1步後第二個指針開始從頭向尾移動,第一個指針到尾結點時第一個指針指向倒數第k個結點。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead==NULL || k==0)
            return NULL;
  
        ListNode *pAhead=pListHead;
        ListNode 
*pBehind=NULL; for(int i=1;i<k;i++){ pAhead=pAhead->next; if(pAhead==NULL) return NULL; } pBehind = pListHead; while(pAhead->next != NULL){ pAhead=pAhead->next; pBehind=pBehind->next; }
return pBehind; }

測試用例:

  1. 功能測試(第k個節點在鏈表的中間,第k個節點在鏈表的頭節點,第k個節點在鏈表的尾結點)
  2. 特殊輸入(鏈表的頭節點為NULL,鏈表長度小於k,k等於0)

註意:

考慮特殊用例,上面測試用例中的特殊輸入,增加代碼的魯棒性。

當用一個指針遍歷鏈表不能解決問題時,可以嘗試兩個指針或多個指針以不同步長移動以達到目的。

相關題目:

1.求鏈表的中間節點:定義兩個指針,同時從頭節點除法,一個一次走一個節點,一個一次走兩個節點,走得快的指針走到末尾時,走得慢的指針指向中間節點。

2.判斷一個單向鏈表是否形成了環形結構:和1的方法一樣,若走的快的指針與走的慢的指針相遇,則有環,若走的快的指針已經到了末尾也沒有追上走得慢的指針,則無環。

劍指offer編程-鏈表中倒數第k個結點