【剑指offer较难部分20】删除链表中重复的结点(java详解)

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
在这里插入图片描述
注意:这里是重复则全部删除

分析

思路
1、判断链表是否为空
2、因需要执行删除操作,故定义前驱结点pre和当前结点
3、遍历链表并判断是否有相同重复的结点,相同则全部删除

实现代码如下:

public class Solution {
    
    
    public ListNode deleteDuplication(ListNode pHead){
    
    
        //1、链表为空
        if(pHead==null || pHead.next == null)
            return pHead;
        ListNode HeadNode = new ListNode(0);//添加头节点方便操作
        HeadNode.next = pHead;//头节点接在链表的头部
        //2、需要执行删除操作,故定义前驱结点pre、当前结点p
        ListNode pre = HeadNode, p = HeadNode.next;
        //3、遍历链表并判断是否有相同重复的结点,相同则全部删除
        while(p != null){
    
    
            if(p.next != null && p.val == p.next.val){
    
    //如果当前结点和下个结点相同
                while(p.next != null && p.val == p.next.val)//找到最后一个相同的结点
                    p = p.next;//跳过相同的结点
                pre.next = p.next;//将最后一个相同的结点的下一个结点链接在pre之后,实现删除重复结点
                p = p.next;//p后移一位
            }
            else{
    
    
                //p.next=null或者下一个结点和当前结点不同,pre和p都后移
                pre = pre.next;
                p = p.next;
            }
        }
        return HeadNode.next;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39615182/article/details/112728164