刪除單向鏈表中的重複節點

題目:

在一個排序(保證重複節點連在一塊)的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。如 輸入鏈表:1->2->3->3->4->4->5 ,處理後爲:1->2->5

解析 :

要想刪除重複節點有兩個關鍵點需要解決:

  1. 確定新的頭結點。因爲對於原鏈表來說,頭結點可能是重複節點,所以也可能會被刪除
  2. 如何保證刪除重複節點以後,仍然保證鏈表保持連接,而不會斷開。

思路:

幾個關鍵變量:
1. cur:指向當前遍歷到的節點
2. pre:指向最近一個不重複節點,也就是已經選取出來的不含有重複節點的鏈表的尾節點(注意pre不是指向cur 的前一個節點)。當還未發現不重複節點時,pre = null。pre 是保持鏈表連讀的關鍵,pre式中與剩餘鏈表保持連接
3. next:指向cur的下一個節點
4. head:表示可能的頭結點。因爲當pre = null時,表示還未發現不重複的節點,head指向的是可能的都節點,一旦pre != null,則head的值即爲不含有重複節點的鏈表的頭結點。

過程:

初始時,head指向原鏈表的頭結點,pre = null。
步驟1:遍歷鏈表,當前遍歷節點爲cur,next指向下一個節點,如果節點cur的值與next的值不相同,則執行步驟2;否則表示當前節點和下一個節點是重複節點,都需要刪除,執行步驟3
步驟2:令pre = cur,並且cur指向寫一個節點
步驟3:從cur繼續向後遍歷節點,直到發現與節點cur的值不同的節點next(保證當前遍歷到的重複節點位於pre與next之間),如果此時pre = null,說明還未發現不重複的節點,則將head指向可能的頭結點next。如果pre 不是null,則將pre與next中間重複的節點刪除,即將pre的下一個節點指向next。當前節點cur指向next,然後重複執行步驟1

java代碼:

public ListNode deleteDuplication(ListNode pHead){
        if(pHead == null)
            return null;
        ListNode head = pHead;
        ListNode pre = null;
        ListNode cur = pHead;
        while(cur != null){
            Boolean toBeDelete = false;
            ListNode next = cur.next;
            //步驟1
            if(next != null && cur.val == next.val){
                toBeDelete = true;
            }
            //步驟2
            if(toBeDelete != true){
                pre = cur;
                cur = next;
            }else{
                //步驟3
                while(next != null && cur.val == next.val){
                    cur = next;
                    next = next.next;
                }
                if(pre == null){
                    head = next;
                    cur = next;
                }else{
                    pre.next = next;
                    cur = next;
                }
            }
        }
        return head;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章