LeetCode203. 移除連結串列元素
阿新 • • 發佈:2020-08-04
連結串列的“刪除”,往往採用的是跳過的方式,即如果p -> next是我們要“刪除”的節點,我們只要把p的next指標指向p -> next -> next就可以了,也就是讓連結串列跳過p -> next,讓這個節點“社會性死亡”。
根據這個思路,這一題裡我們只需要遍歷連結串列,判斷節點值是否與我們要刪除的相等,如果相等,就跳過這個連結串列。
不過考慮到有可能連結串列一開始就是我們要刪除的節點,所以我們需要先找到第一個不為要刪除的值V的節點,將這個節點作為head,然後從這個節點開始遍歷到連結串列結尾,刪除節點。
程式碼如下:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* removeElements(ListNode* head, int V) { if(head == NULL) { return NULL; } while(head != NULL && head -> val == V) { //由於連結串列的開頭元素就有可能需要刪除,而這時我們還沒有節點有next指標指向這個元素呢,因此需要先找到我們的連結串列頭,也就是第一個值不為V的節點 head = head -> next; } ListNode* p = head; //確定連結串列頭之後,就可以開始遍歷連結串列,根據節點的next指標判斷每個節點是否要刪除了 while(p != NULL) { if(p -> next != NULL && p -> next -> val == V) { //刪除的情況就是,p的下一個節點不為空,且下一個節點值就是我們要刪除的值 p -> next = p -> next -> next; } else { //繼續往後找 p = p -> next; } } return head; } };