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

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

\color{blue}解題思路:
由於這是單鏈表,只能往一個方向遍歷,因此第一想法可能是先遍歷一遍鏈表,計算一下鏈表節點的總個數n,再從頭開始走n - k個節點就是倒數k個節點。這種思路並沒有啥毛病,不過有一種只訪問一遍的思路。

使用resPtrkAfterPtr兩個指針,kAfterPtrresPtr先除法k個節點。
然後resPtrkAfterPtr同時向後移動,當kAfterPtr到達鏈表的尾端時,此時resPtr指向的就是倒數第k個節點。
在這裏插入圖片描述
\color{blue}代碼實現:

/*
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;
    }
};

在這裏插入圖片描述
\color{blue}題目推薦:
題1、LeetCode 矩陣置零
題2、LeetCode 下一個排列
題3、LeetCode 編輯距離(動態規劃)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章