題目:在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5
分析:
-
如果鏈表為空,或者只有一個結點,直接返回
-
如果鏈表結點大於等於2,則比較當前結點和下一個結點是否相同,如果相同,則刪除當前結點和下一個結點,比較下下個結點是否和當前結點相同,如果相同繼續刪除,直至與當前結點不同。
-
返回鏈表表頭是第一個不重復結點,需要一個前驅結點prenode記錄不重復鏈表,其next應該初始為NULL,如果有下一個不重復結點,則next是下一個不重復結點。
1 public class Solution { 2 public ListNode deleteDuplication(ListNode pHead) 3 { 4 if(pHead==null){ 5 return null; 6 } 7 8 ListNode root=new ListNode(0); 9 root.next=pHead; 10 ListNode preNode=root; 11 ListNode curNode=pHead; 12 while(curNode!=null){ 13 if(curNode.next!=null&&curNode.val==curNode.next.val){ 14 while(curNode.next!=null&&curNode.val==curNode.next.val){ 15 curNode=curNode.next; 16 } 17 preNode.next=curNode.next; 18 }else{ 19 preNode=curNode; 20 } 21 curNode=curNode.next; 22 } 23 return root.next; 24 } 25 }