【劍指offer較難部分20】刪除連結串列中重複的結點(java詳解)
阿新 • • 發佈:2021-01-19
技術標籤:劍指offer(java)連結串列資料結構java單鏈表
題目描述
在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5
注意:這裡是重複則全部刪除
分析
思路:
1、判斷連結串列是否為空
2、因需要執行刪除操作,故定義前驅結點pre和當前結點
3、遍歷連結串列並判斷是否有相同重複的結點,相同則全部刪除
實現程式碼如下:
public class Solution {
public ListNode deleteDuplication (ListNode pHead){
//1、連結串列為空
if(pHead==null || pHead.next == null)
return pHead;
ListNode HeadNode = new ListNode(0);//新增頭節點方便操作
HeadNode.next = pHead;//頭節點接在連結串列的頭部
//2、需要執行刪除操作,故定義前驅結點pre、當前結點p
ListNode pre = HeadNode, p = HeadNode.next;
//3、遍歷連結串列並判斷是否有相同重複的結點,相同則全部刪除
while(p != null){
if(p.next != null && p.val == p.next.val){//如果當前結點和下個結點相同
while(p.next != null && p.val == p.next.val)//找到最後一個相同的結點
p = p.next;//跳過相同的結點
pre.next = p.next;//將最後一個相同的結點的下一個結點連結在pre之後,實現刪除重複結點
p = p.next;//p後移一位
}
else{
//p.next=null或者下一個結點和當前結點不同,pre和p都後移
pre = pre.next;
p = p.next;
}
}
return HeadNode.next;
}
}