LeetCode 19.刪除連結串列的倒數第N個結點
阿新 • • 發佈:2021-12-13
題目
給你一個連結串列,刪除連結串列的倒數第 n 個結點,並且返回連結串列的頭結點。
示例 1:
輸入:head = [1,2,3,4,5], n = 2
輸出:[1,2,3,5]
示例 2:
輸入:head = [1], n = 1
輸出:[]
示例 3:
輸入:head = [1,2], n = 1
輸出:[1]
分析
可以先求連結串列長度length,然後向後走length - n步找到待刪元素的前一位,但是至少要兩次遍歷連結串列;
使用快慢指標法可以一次遍歷找到待刪元素
圖解
上述思路有一個問題,當n = k, 即待刪除元素時第一個結點時,需要另外討論,為了對所有節點統一處理,簡化操作,使用一個偽結點技巧,即插入一個偽結點dummy,它的next指向head.,其他過程完全不變,如下:
圖解
程式碼
class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummpy = new ListNode(0); dummpy->next = head; ListNode* fast = dummpy; ListNode* slow = dummpy; while (n--) { fast = fast->next; } fast= fast->next; //fast先走n+1步 while (fast != NULL) { fast = fast->next; slow = slow->next; } //此時slow指向待刪除的前一個結點 slow->next = slow->next->next; return dummpy->next; } };