1. 程式人生 > 其它 >LeetCode82. 刪除排序連結串列中的重複元素 II

LeetCode82. 刪除排序連結串列中的重複元素 II

LeetCode82. 刪除排序連結串列中的重複元素 II

題目說明

 /**
     * 
     * 存在一個按升序排列的連結串列,給你這個連結串列的頭節點 head ,
     * 請你刪除連結串列中所有存在數字重複情況的節點,
     * 只保留原始連結串列中沒有重複出現的數字。
     *
     * 返回同樣按升序排列的結果連結串列。
     *
     */

思路分析

  1. 刪除連結串列中重複的元素,因為連結串列是按順序排列的,因此進行一次遍歷,將重複的刪除即可
  2. 刪除重複的元素,是指將重複的元素全部刪除,只剩餘不重複的,因為連結串列中重複的元素可能有多個,即一個元素可能出現多次,因此需要使用迴圈刪除
  3. 要刪除連結串列的當前節點,需要先找到連結串列的前一個節點,因為直接找到要刪除的節點是刪除不了的
  4. 考慮到連結串列的前兩個元素可能是重複的,因此需要建立一個空的頭節點,讓它的下一節點指向head,方便刪除head的頭節點
  5. 先判斷當前節點的下一節點的值和下一節點的後一節點的值是否相等,如果相等,則記錄相等的節點的值,然後刪除這兩個節點,並判斷後邊節點的值是否也等於這個值,如果也相等,則再刪除
  6. 迴圈結束後,則刪除完畢
  7. 原始碼見下

原始碼及分析

/**
     * 
     * @param head 要刪除重複元素的連結串列
     * @return 返回刪除後的新連結串列
     */
    public ListNode deleteDuplicates2(ListNode head) {
        //判斷節點是否為空或者是否只有一個節點
        if (head == null || head.next == null){
            return head;
        }
        //因為連結串列的第一第二個元素可能重複,因此需要一條新連結串列讓它的下一個元素指向head
        ListNode newHead = new ListNode(0,head);
        //定義輔助變數用於遍歷
        ListNode cur = newHead;
        while (true){
            //迴圈結束的條件
            if (cur.next == null || cur.next.next == null){
                break;
            }
            //如果要刪除當前節點,必須找到要刪除節點的前一個節點
            if (cur.next.val == cur.next.next.val){
                //定義變數儲存重複值的第一個元素
                int value = cur.next.val;
                //迴圈判斷是否有重複的多個元素,將其都刪除
                while (cur.next != null && cur.next.val == value){
                    cur.next = cur.next.next;
                }
                //如果不重複,則指標後移指向後一個節點繼續判斷
            }else {
                cur = cur.next;
            }
        }
        return newHead.next;
    }