day3連結串列

zhangenigma發表於2024-06-07

題目:

https://leetcode.cn/problems/remove-linked-list-elements/submissions/537974263/
題目解析:
https://programmercarl.com/0203.移除連結串列元素.html

這道題用了dummyHead,會簡單非常多,但是需要注意的是,如果不用dummyHead的話,去除head為啥使用while而不是if呢?
個人理解是,可能會出現很多個連續的符合val值的節點,這樣的話只用if就只刪除了一個,而用while的話可以盡數刪除。

此外cur是一個指標,它指向某個節點,從而可以改變這個節點的指向,並且絕大多數題目都是cur驅動的,使用

while(cur!= null)或
while(cur)

這裡的區別是如果使用cur!=則最終的指標是指向最後一個節點,而使用cur的話最終是指向null;

題目:

https://leetcode.cn/problems/design-linked-list/
題目解析:
https://programmercarl.com/0707.設計連結串列.html#思路
這裡是一個類,包括建構函式,private和public;
值得注意的是

void deleteAtIndex(int index) {
        if (index >= _size || index < 0) {
            return;
        }
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur ->next;
        }
        LinkedNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        //delete命令指示釋放了tmp指標原本所指的那部分記憶體,
        //被delete後的指標tmp的值(地址)並非就是NULL,而是隨機值。也就是被delete後,
        //如果不再加上一句tmp=nullptr,tmp會成為亂指的野指標
        //如果之後的程式不小心使用了tmp,會指向難以預想的記憶體空間
        tmp=nullptr;
        _size--;
    }

這段的tmp = nullptr我個認為是不需要的,作用域結束後會把tmp銷燬掉,但是顯示指出可能才是大佬的風格把,以後也可以注意把此類指標顯示設定為nullptr,養成好習慣。

題目:

https://leetcode.cn/problems/reverse-linked-list/submissions/537978356/
題目解析:
https://programmercarl.com/0206.翻轉連結串列.html#演算法公開課
這道題就是可以指向null的推進方式,與其說它是雙指標,不如認為是三指標,它推動的方式是使用cur,但是其實是透過tmp來確定移動的方向,
而採用pre = cur可以保證pre指標一直在cur前一個。因此是cur是動力源,而pre和tmp都作為錨定點來標明前一個和後一個節點。
因為cur最終是在null,因此返回值得是pre。

相關文章