刪除單向連結串列中的重複節點
阿新 • • 發佈:2019-02-07
題目:
在一個排序(保證重複節點連在一塊)的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。如 輸入連結串列:1->2->3->3->4->4->5 ,處理後為:1->2->5
解析 :
要想刪除重複節點有兩個關鍵點需要解決:
- 確定新的頭結點。因為對於原連結串列來說,頭結點可能是重複節點,所以也可能會被刪除
- 如何保證刪除重複節點以後,仍然保證連結串列保持連線,而不會斷開。
思路:
幾個關鍵變數:
1. cur:指向當前遍歷到的節點
2. pre:指向最近一個不重複節點,也就是已經選取出來的不含有重複節點的連結串列的尾節點(注意pre不是指向cur 的前一個節點)。當還未發現不重複節點時,pre = null。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;
}