題目描述:函數
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5this
解題思路:spa
首先初始化一個起始指針preNode指向頭結點、工做指針walkNode指向鏈表的第一個元素,即preNode.next=walkNode。3d
迭代開始:指針
while(walkNode!=null){code
若是當前工做結點的數據域walkNode.val與下一個結點的數據域walkNode.next.val相同(出現重複結點):blog
preNode不移動;(指向重複結點段的前一個結點)排序
walkNode移動:walkNode=walkNode.next;(此時preNode.next!=walkNode)io
不然,class
若是preNode.next==walkNode(說明未出現重複節點):
preNode移動,walkNode移動:preNode=walkNode;walkNode=walkNode.next;
不然,說明有重複結點,此時preNode指向重複結點段的前一個結點,walkNode指向重複結點段的最後一個重複結點
使preNode直接指向重複結點段的下一個結點:preNode.next=walkNode.next;
walkNode移動:walkNode=walkNode.next;
}
注意:由於可能會刪除頭結點,例如{1,1,1,2},刪除了頭結點1和第一個結點1,結果應爲{2}。可是若是直接將函數傳進來的pHead做爲頭結點,即初始化preNode=pHead,那麼頭節點永遠不可能被刪除,獲得的結果只能爲{1,2}。
所以這裏添加了一個新的頭節點newhead,將pHead當通常結點處理,初始化preNode=newhead這樣就能夠避免出現上面的錯誤。
舉例:
1->2->3->3->4->4 (加入新頭結點newhead:newhead.val=0,;ewhead.next=pHead) 0->1->2->3->3->4->4
初始化:
preNode指向新的頭結點,walkNode指向第一個結點
preNode=newNode
walkNode=newhead.next
第1次迭代:
walkNode1與其下一個結點2不相同,並且preNode0和walkNode1相鄰,說明以前也沒有出現太重複結點,因此把兩個指針都前移
walkNode.next.val!=walkNode.val&&pre.next==walkNode:pre=walkNode;walkNode=walkNode.next;
第2次迭代:
同第一次迭代
walkNode.next.val!=walkNode.val&&pre.next==walkNode:pre=walkNode;walkNode=walkNode.next;
第3次迭代:
walkNode3與下一個結點3重複,那麼此時preNode不移動,只移動walkNode
walkNode.next.val==walkNode.val:walkNode=walkNode.next
第4次迭代:
walkNode3與其下一個結點4不相同,可是此時preNode和walkNode不相鄰,說明preNode和walkNode中間出現了重複結點,因此把preNode直接指向walkNode的下一個結點,拋棄中間重複節點
walkNode.next.val!=walkNode.val&&pre.next!=walkNode:pre.next=walkNode.next;walkNode=walkNode.next;
第5次迭代:
walkNode4與下一個結點4重複,那麼此時preNode不移動,只移動walkNode
walkNode.next.val==walkNode.val:walkNode=walkNode.next
第6次迭代:
walkNode.next==null&&pre.next!=walkNode:pre.next=walkNode.next;return newNode.next;
代碼實現
1 package struct; 2 public class deleteList { 3 //public class ListNode { 4 // int val; 5 // ListNode next = null; 6 // ListNode(int val) { 7 // this.val = val; 8 // } 9 //} 10 public ListNode printListFromTailToHead(ListNode pHead) { 11 ListNode newhead=new ListNode(0);//解決刪除頭結點的可能,例如{1,1,1,1,2} 12 newhead.next=pHead; 13 ListNode pre=newhead; 14 ListNode walkNode=newhead.next; 15 while(walkNode!=null){ 16 if(walkNode.next!=null){ 17 if(walkNode.next.val!=walkNode.val){ 18 if(pre.next!=walkNode) 19 { 20 pre.next=walkNode.next; 21 } 22 else 23 { 24 pre=walkNode; 25 } 26 } 27 } 28 else{ //若是walkNode指向最後一個結點 29 if(pre.next!=walkNode) 30 { 31 pre.next=walkNode.next; 32 } 33 else 34 { 35 pre=walkNode; 36 } 37 } 38 walkNode=walkNode.next; 39 } 40 return newhead.next; 41 } 42 }