1.題目
題目地址(203. 移除連結串列元素 - 力扣(LeetCode))
https://leetcode.cn/problems/remove-linked-list-elements/
題目描述
給你一個連結串列的頭節點 head
和一個整數 val
,請你刪除連結串列中所有滿足 Node.val == val
的節點,並返回 新的頭節點 。
示例 1:
輸入:head = [1,2,6,3,4,5,6], val = 6 輸出:[1,2,3,4,5]
示例 2:
輸入:head = [], val = 1 輸出:[]
示例 3:
輸入:head = [7,7,7,7], val = 7 輸出:[]
提示:
- 列表中的節點數目在範圍
[0, 104]
內 1 <= Node.val <= 50
0 <= val <= 50
2. 題解
2.1 迭代
思路
設定一個虛擬頭結點 dummyhead, 接上head,防止head被刪除,導致的heap-use-after-free 訪問堆中已釋放的地址異常
程式碼
- 語言支援:C++
C++ Code:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead = new ListNode(0, head);
ListNode* cur = head, * prev = dummyHead;
while (cur != nullptr) {
if (cur->val == val) {
prev->next = cur->next;
delete cur;
cur = prev->next;
} else {
prev = prev->next;
cur = cur->next;
}
}
return dummyHead->next;
}
};
複雜度分析
令 n 為陣列長度。
- 時間複雜度:\(O(n)\)
- 空間複雜度:\(O(1)\)
2.2 遞迴
思路
設定返回條件和遞迴條件即可
程式碼
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
if(head == nullptr) return head;
head->next = removeElements(head->next, val);
return head->val == val ? head->next : head;
}
};