leetcode 刪除連結串列倒數第 n 個結點 中等
阿新 • • 發佈:2021-08-07
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; } };