題目描述:
問題:1->2->3->4 val=2
要求輸出為:1->3->4
解題思路:
1: 遍歷一遍鍊錶,對比每個節點,刪除值為val的節點;
2(需要注意的點):一般來說遍歷都是從頭開始,但是在這種沒有頭節點的鍊錶中勢必要考慮若第乙個節點就為所要刪除的節點時該如何解決
if(!head)
return head;
while(head && head->val==val)//排除第乙個節點就為所需刪除節點
//和全部為需要刪除節點的情況
head=head->next;
if(!head) //這裡需要排除節點都刪除完的情況
return head;
從這裡看,顯然從第乙個節點處開始遍歷是比較麻煩的,那我們是否可以跳過第乙個節點而從第二個節點處開始呢?答案是可以的,在這種情況下,我們只需要在遍歷完成後再回過頭來判斷一下第乙個節點就好。
//注意前面是要從第二個節點處開始遍歷的過程
if(head->val==val)
head->head->next;
這樣的**顯然是更加簡介的而且邏輯也與第乙個沒有多大差別。
下邊為完整**實現:
//非遞迴實現
struct listnode* removeelements(struct listnode* head, int val)
else
}if(head->val==val)
head=head->next;
return head;
}
//遞迴實現
listnode *removeelements(listnode *head, int val)
倆種方法對比:雖然倆種方法都可解決問題,但各有其優劣置處。遞迴**簡潔,但邏輯較難理解且其執行效率與消耗記憶體都相對較高,而常規方法則與之相反。
非遞迴**執行邏輯:
刪除鍊錶中所有值為k的節點
給定乙個單鏈表,刪除其中值為 的所有節點。例如 1 2 6 3 4 5 6 刪除其中值為6的節點,返回 1 2 3 4 5 這是乙個簡單的鍊錶操作題。刪除是要考慮的節點所在的位置 頭部,中間和尾部 分開處理一下好了。主要過程如下描述 i.wh ileh ead va l ta rget head h...
刪除鍊錶中等於給定值val的所有節點
刪除鍊錶中等於給定值val的所有節點 例如 給出鍊錶1 2 3 3 4 5 3,和 val 3,你需要返回刪除3之後的鍊錶 1 2 4 5 way1 迭代 追加人為表頭 陷入沒有表頭的陷阱,總是想記下刪除節點的先驅,導致折騰了很久,其實只要人為加乙個表頭就簡單很多了!definition for s...
刪除鍊錶中等於給定值 val 的所有節點。
採用快慢針的方法,listnode p指向鍊錶頭部,listnode q p.next。再定義乙個listnode start表示刪除指定val值後的頭結點,先賦值為p。結點的遍歷從q結點開始,當q.val不等於val時,p的下乙個結點指向q,並且p q同時向後移動,直至q null,表示遍歷鍊錶結...