力扣-203. 移除連結串列元素

DawnTraveler發表於2024-05-01

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;
    }
};

相關文章