剑指offer——删除链表中重复的结点

继续链表;原题目链接:删除链表中重复的结点

题目描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 }

此代码以通过牛客网。

原文地址:https://www.cnblogs.com/shengguilv/p/12984373.html