現在有一個單鏈表。鏈表中每個節點保存一個整數,再給定一個值val,把所有等于val的節點刪掉。
給定一個單鏈表的頭結點head,同時給定一個值val,請返回清除后的鏈表的頭結點,保證鏈表中有不等于該值的其它值。請保證其他元素的相對順序。
ListNode* clear(ListNode* head, int val) {
if(!head)
return nullptr;
while(head->val==val){ //注意了,不是if而是while因為新的頭部也可能是待刪的。
//所以可見頭結點鏈表的優越性
ListNode* t=head->next;
delete head;
head=t;
}
if(!head)
return nullptr;
ListNode* p=head; //
while(p->next){
if(p->next->val==val){
ListNode* t=p->next;
p->next=t->next;
delete t;
}
else //加上else
p=p->next; //注意不能所有情況都next,這樣兩個連在一起的就會出錯。
}
return head;
}
思考
看似很簡單的問題,其實很容易出錯:
- 首結點就是待刪結點的問題:
以為做一個簡單的if就可以了,實際上不是,因為刪掉首結點,露出來的新首結點可能還是待刪結點。所以要做一個循環來得到第一個非刪結點。此時可以看到,帶頭結點的鏈表處理起來會順利多得多。 - 遍歷指針的問題:
如果刪除了某個結點,遍歷指針直接跳到該結點后?還是結點前?一不小心就會少刪,對于相同值連在一起的情況