題目:
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。