LintCode——刪除連結串列中的元素
阿新 • • 發佈:2019-02-02
描述:
刪除連結串列中等於給定值val
的所有節點。
樣例:
給出連結串列 1->2->3->3->4->5->3
,
和 val = 3
,
你需要返回刪除3之後的連結串列:1->2->4->5
。
分析:
先判斷連結串列的頭節點是否為要刪除的節點,若是,將head指標向後移;若不是,無需操作。
指標pre當前訪問節點的前一個節點(pre指向的節點的值一定不為val)。
判斷當前訪問節點的值是否為val:
若是,將pre->next指向當前訪問節點的下一個節點
若不是,將pre向後移動一個節點。
PS:加上程式碼中註釋掉的程式碼,是以前寫的兩根指標實現的(看看就好了,不必當真)。
寫部落格的時候發現一根指標也能實現,而且邏輯更清晰(真不曉得以前怎麼想的)。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: /** * @param head a ListNode * @param val an integer * @return a ListNode */ ListNode *removeElements(ListNode *head, int val) { // Write your code here if(head == NULL) return NULL; // 先判斷連結串列頭節點是否為要刪除的節點 while(head->val == val){ head = head->next; if(head == NULL) return NULL; } //ListNode *curr = head->next; ListNode *pre = head; while(pre->next != NULL){ if(pre->next->val == val) pre->next = pre->next->next; else pre = pre->next; } /* while(curr != NULL){ if(curr->val == val){ if(curr->next == NULL){ //連結串列最後一個元素為要刪除的元素 pre->next = NULL; //直接讓倒數第二個元素指向NULL break; // 注意while的迴圈條件,這句不寫會一直迴圈 改為break(更優,少判斷一次)亦可。 curr = NULL } else{ curr->val = curr->next->val; curr->next = curr->next->next; } } else{ pre = pre->next; curr = curr->next; } } */ return head; } };