數據結構---LeetCode鏈表使用(刪除指定值的節點)

1. 題目

  1. 題目:刪除鏈表中等於給定值 val 的所有節點。(LeetCode 203)
  2. 案例:
    輸入: 1->2->6->3->4->5->6, val = 6
    輸出: 1->2->3->4->5

2. 解法一: 先得到第一個不是需要刪除的節點.

public ListNode removeElements(ListNode head, int val) {
    // 1. 可能存在一開始就是需要刪除的節點
    while (head != null && head.val == val) {
        ListNode delNode = head;
        head = head.next;
        delNode.next = null; // delNode斷開和鏈表的連接
    }

    // 經過第一步, 保證了val開頭的所有節點全部刪除
    if (head == null) {
        return null;
    }

    ListNode pre = head; // 此節點肯定不是val, 因此就得到了前一節點.
    while (pre.next != null) { 
    	// 可能一直都是需要刪除的元素, 因此只有下一個節點不是需要刪除的節點時, 才能移動位置
        if (pre.next.val == val) {
            ListNode delNode = pre.next;
            pre.next = delNode.next;
            delNode.next = null;
        } else {
            pre = pre.next;
        }
    }

    return head;
}

3. 解法二:使用虛擬頭節點, 不需要特殊處理頭節點

public ListNode removeElements(ListNode head, int val) {
    // 創建虛擬頭節點.
    ListNode dummyHead = new ListNode(-1);
    dummyHead.next = head;

    ListNode pre = dummyHead;
    while (pre.next != null) {
        if (pre.next.val == val) {
            ListNode delNode = pre.next;
            pre.next = delNode.next;
            delNode.next = null;
        } else {
            pre = pre.next;
        }
    }

    return dummyHead.next;
}

4. 解法三:使用遞歸

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

    ListNode result = removeElements(head.next, val);
    /**
     * 迴歸的時候, 判斷當前節點是否需要刪除;
     * 需要刪除, 即忽略當前節點; 返回以前的鏈表.
     * 不需要刪除, 即把返回值鏈表, 拼接在當前節點的next上, 形成新的返回鏈表.
     */
    if (head.val == val) {
        return result;
    } else {
        head.next = result;
        return head;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章