算法修煉之路——【鏈表】Leetcode 203 移除鏈表元素

題目描述

刪除鏈表中等於給定值val的所有節點。

示例1:

輸入: head = [1, 2, 6, 3, 4, 5, 6], val = 6
輸出: [1, 2, 3, 4, 5]

思路分析

這道題目爲簡單程度,所以我們這裏給出簡單思路。
我們需要考慮一般規則,當刪除節點爲中間或非兩端節點時,直接令被刪節點的前置節點指針直接指向被刪節點後置節點即可,這裏我們可將核心代碼給出:

代碼1: 刪除節點的一般實現

// assume that "nodePrev -> node -> nodeNext":
// nodePrev.next = node;
// (node.val == val) = True

// remove node
nodePrev.next = node.next; // OR nodePrev.next = nodePrev.next.next;

邊界情況考慮

這裏需要考慮兩個邊界情況:

  1. 當鏈表頭節點滿足head.val == val時;
  2. 當鏈表尾節點滿足tail.val == val時。

問題1:頭節點滿足刪除條件
這裏我們由代碼1可知,我們的操作依據主要是nodePrev節點,但是頭節點沒有前置節點,這時候我們可以主動引入哨兵節點dummyHead,直接令dummyHead.next = head, 則一般規則就對**問題1 **依然適用。

問題2:尾節點滿足刪除條件
我們先通過代碼1進行簡單的分析,當尾節點要被刪除時,其後置節點爲null, 此時將前置節點指向空指針nodePrev.next = null; 並不影響代碼,所以這裏我們直接給出步驟及解題代碼:

解題步驟

  1. 初始化指針,一個爲遍歷指針p, 另一個爲哨兵節點dummyHead
  2. 遍歷原始鏈表,並刪除指定節點;
  3. 返回結果dummyHead.next.

解題代碼

    public static ListNode solution(ListNode head, int val) {
        if (head == null) {
            return null;
        }

        /* Step1: Init. pointers */
        
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode p = dummyHead;

        /* Step2: go through the head-list
        and
        remove specified nodes with value of "val"
         */
        while(p.next != null){
            if(p.next.val == val){
                p.next = p.next.next;                
            }else{
                p = p.next;
            }
        }
        /* Step3: return dummyHead's next-node */
        return dummyHead.next;
    }

複雜度分析

時間複雜度:我們對原始鏈表進行了一次遍歷,容易理解時間複雜度爲O(N);
空間複雜度:我們這裏沒有設置輔助容器,故空間複雜度爲O(1).

GitHub源碼

完整可運行文件請訪問GitHub

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章