继续链表;原题目链接:删除链表中重复的结点。
题目描述:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
题目分析:
删除一个结点很简单,只需要将当前指针指向下一个结点的指向结点即可;即a.next=b.next即可。
但是若要连自身节点也要删去,则需要另外一个指针,记录上一个结点。
还有一个特殊情况就是:当重复的节点位于头结点时,没有上一个结点,只需要抛弃头结点即可。
判断重复时,也要考虑到多个结点重复的情况,不能发现两者重复就直接删除;还要判断接下来的结点是否重复,直至不重复为止。
实现代码如下:
1 public class Solution { 2 public ListNode deleteDuplication(ListNode pHead) 3 { 4 ListNode preNode = null; //用作记录上一个节点的节点 5 ListNode curNode = pHead; //用作记录当前节点的节点 6 7 while(curNode != null ){ 8 if(curNode.next != null && curNode.val==curNode.next.val){ 9 //若当前与下一个结点的值重复 10 while(curNode.next != null && curNode.next.val == curNode.val){ 11 curNode = curNode.next; //持续判断下去,直到链表的末尾或者不重复为止 12 } 13 curNode = curNode.next; 14 if(preNode == null){ 15 pHead = curNode; 16 }else { 17 preNode.next = curNode; 18 } 19 }else{ 20 //若当前与下一个结点的值不重复,继续比较下一个结点 21 preNode = curNode; 22 curNode = curNode.next; 23 } 24 } 25 //返回头节点 26 return pHead; 27 } 28 }
此代码以通过牛客网。