1. 程式人生 > >刪除單向連結串列中的重複節點

刪除單向連結串列中的重複節點

題目:

在一個排序(保證重複節點連在一塊)的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。如 輸入連結串列: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; }