刪除鏈表中重複的結點——牛客劍指offer

題目描述:函數

在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表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 }
相關文章
相關標籤/搜索