題目描述
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
由於這是單鏈表,只能往一個方向遍歷,因此第一想法可能是先遍歷一遍鏈表,計算一下鏈表節點的總個數n
,再從頭開始走n - k
個節點就是倒數k個節點。這種思路並沒有啥毛病,不過有一種只訪問一遍的思路。
使用resPtr
、kAfterPtr
兩個指針,kAfterPtr
比resPtr
先除法k個節點。
然後resPtr
、kAfterPtr
同時向後移動,當kAfterPtr
到達鏈表的尾端時,此時resPtr
指向的就是倒數第k
個節點。
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode *resPtr = pListHead, *kAfterPtr = pListHead;
//kAfterPtr先出發k個節點
while (k > 0) {
if (kAfterPtr == NULL) {
//可能出現鏈表長度爲5,但是要求找倒數第6個
return NULL;
}
k -= 1;
kAfterPtr = kAfterPtr->next;
}
//resPtr、kAfterPtr再同時移動
while (kAfterPtr != NULL) {
resPtr = resPtr->next;
kAfterPtr = kAfterPtr->next;
}
return resPtr;
}
};