删除链表中重复的结点——牛客剑指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 }
相关文章
相关标签/搜索