LeetCode-203 刪除鏈表元素

一、題目描述

刪除鏈表中等于給定值 val 的所有節(jié)點(diǎn)。
示例:
輸入: 1->2->6->3->4->5->6, val = 6
輸出: 1->2->3->4->5

二、解題思路

解法1:

刪除結(jié)點(diǎn)的步驟
1. 找到該結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)
2. 進(jìn)行刪除操作
除頭結(jié)點(diǎn)時(shí)另做考慮(由于頭結(jié)點(diǎn)沒(méi)有前一個(gè)結(jié)點(diǎn))

代碼實(shí)現(xiàn)

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while (head != nullptr && head->val == val) {
            head = head->next;
        }

        if (head == nullptr) return head;
        ListNode *prev = head;
        // 確保當(dāng)前節(jié)點(diǎn)后還有節(jié)點(diǎn)
        while (prev->next != nullptr) {
            if (prev->next->val == val) {
                prev->next = prev->next->next;
            } else {
                prev = prev->next;
            }
        }
        return head;
    }
};

解法2:

避免分別處理頭結(jié)點(diǎn)和剩余節(jié)點(diǎn),可以通過(guò)在頭結(jié)點(diǎn)前增加一個(gè)節(jié)點(diǎn),統(tǒng)一操作

代碼實(shí)現(xiàn):

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        while (head != nullptr && head->val == val) {
            head = head->next;
        }

        if (head == nullptr) return head;
        ListNode *prev = head;
        // 確保當(dāng)前節(jié)點(diǎn)后還有節(jié)點(diǎn)
        while (prev->next != nullptr) {
            if (prev->next->val == val) {
                prev->next = prev->next->next;
            } else {
                prev = prev->next;
            }
        }
        return head;
    }
};

可以模擬下程序的執(zhí)行步驟,加深理解

四、總結(jié)

鏈表題涉及到指針的操作,應(yīng)當(dāng)足夠細(xì)心,栓新繩,解舊繩。
相似題型:反轉(zhuǎn)單鏈表

參考鏈接:https://leetcode-cn.com/problems/remove-linked-list-elements/solution/203yi-chu-lian-biao-yuan-su-by-lewis-dxstabdzew/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容