1. 程式人生 > 其它 >leetcode 刪除連結串列倒數第 n 個結點 中等

leetcode 刪除連結串列倒數第 n 個結點 中等

1:遞歸回溯的時候記錄這是第幾個結點,然後對應做刪除即可。時間 O(n),空間 O(n)

2:雙指標,slow 與 quick,讓 quick 先走 n 步,然後再讓 quick 與 slow 同時走,當 quick == nullptr 時,則 slow 停下的位置為倒數第 n 個結點。

對於法 2,很顯然得到的是倒數第 n 個結點,但刪除這個結點,需要的此結點的前驅,所以考慮在頭部新增一個啞結點 temp,即 temp -> next = head,然後令 quick = head,而 slow = temp。這樣,slow 停下的位置就為 n 的前驅結點。時間 O(n),空間 O(1)

貼法 1 的程式碼:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        auto ret = solve(head, n);
        if(ret == n){   // 刪除第一個結點
            auto ans = head -> next;
            delete head;
            return ans;
        }
        return head;
    }

private:
    
int solve(ListNode *head, const int &n) { if(head == nullptr) return 0; auto ret = solve(head -> next, n); if(ret == n){ auto temp = head -> next; head -> next = head -> next -> next; delete temp; } return ret + 1
; } };