劍指offer編程-鏈表中倒數第k個結點
阿新 • • 發佈:2017-09-28
描述 節點 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; }
測試用例:
- 功能測試(第k個節點在鏈表的中間,第k個節點在鏈表的頭節點,第k個節點在鏈表的尾結點)
- 特殊輸入(鏈表的頭節點為NULL,鏈表長度小於k,k等於0)
註意:
考慮特殊用例,上面測試用例中的特殊輸入,增加代碼的魯棒性。
當用一個指針遍歷鏈表不能解決問題時,可以嘗試兩個指針或多個指針以不同步長移動以達到目的。
相關題目:
1.求鏈表的中間節點:定義兩個指針,同時從頭節點除法,一個一次走一個節點,一個一次走兩個節點,走得快的指針走到末尾時,走得慢的指針指向中間節點。
2.判斷一個單向鏈表是否形成了環形結構:和1的方法一樣,若走的快的指針與走的慢的指針相遇,則有環,若走的快的指針已經到了末尾也沒有追上走得慢的指針,則無環。
劍指offer編程-鏈表中倒數第k個結點