1. 程式人生 > 實用技巧 >LeetCode203. 移除連結串列元素

LeetCode203. 移除連結串列元素

連結串列的“刪除”,往往採用的是跳過的方式,即如果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;
    }
};