1. 程式人生 > 其它 >LeetCode 19.刪除連結串列的倒數第N個結點

LeetCode 19.刪除連結串列的倒數第N個結點

題目
給你一個連結串列,刪除連結串列的倒數第 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; } };