1. 程式人生 > 其它 >【劍指offer較難部分20】刪除連結串列中重複的結點(java詳解)

【劍指offer較難部分20】刪除連結串列中重複的結點(java詳解)

技術標籤:劍指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; } }

在這裡插入圖片描述