LeetCode19刪除連結串列的倒數第N個節點
阿新 • • 發佈:2020-07-30
題目連結
https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
題解一
- 雙指標:一個“快”,一個“慢”
- 快指標先到達連結串列末尾
- 具體思路見程式碼及註釋
// Problem: LeetCode 19 // URL: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ // Tags: Linked List Two Pointers Recursion // Difficulty: Medium #include <iostream> using namespace std; struct ListNode{ int val; ListNode* next; }; class Solution{ public: // 刪除連結串列的倒數第N個節點 ListNode* removeNthFromEnd(ListNode* head, int n) { // 快慢指標 ListNode* fast = head, *slow = head; // 快指標先移動N+1步,慢指標不移動 int i = 0; while (i <= n && fast != nullptr){ fast = fast->next; i++; } // 這個if語句和上個while迴圈中的fast!=nullptr都是為了處理一種特殊情況: // 假如連結串列只有N個元素且要刪除倒數第N個元素,則快指標不能移動N+1步,這時應直接刪除頭節點 if(i!=n+1){ // 刪除頭節點並返回新連結串列 head = head->next; delete slow; return head; } // 快指標和慢指標一起移動直至快指標為空 // 因為快指標先移動了n+1步,所以迴圈結束後慢指標是指向待刪除節點前面的那個節點 while(fast!=nullptr){ fast = fast->next; slow = slow->next; } // 刪除待刪除的節點並返回新連結串列 fast = slow->next; slow->next = fast->next; delete fast; return head; } };
題解二
- 遞迴寫法,很厲害,我參考了別人的
// Problem: LeetCode 19 // URL: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/ // Tags: Linked List Two Pointers Recursion // Difficulty: Medium #include <iostream> using namespace std; struct ListNode{ int val; ListNode* next; }; class Solution{ private: int index=0; public: // 刪除連結串列的倒數第N個節點 ListNode* removeNthFromEnd(ListNode* head, int n) { if(head == nullptr) return nullptr; // 遞迴表示式 head->next = removeNthFromEnd(head->next, n); // 該變數用來標記是倒數第幾個節點,這條語句寫在了遞迴表示式之後,這很關鍵 index++; // 此時head即為待刪除節點前邊的那個節點 if(index == n) return head->next; return head; } };
作者:@臭鹹魚
轉載請註明出處:https://www.cnblogs.com/chouxianyu/
歡迎討論和交流!