删除链表中重复的节点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。

解题思路

设置两个根节点p1和p2,p1负责更改原链表,p2负责检测并跳过重复的节点。
当发现p2与p2的下一个节点值相等时,将p2后移直到p2指向的节点为非重复节点为止。
关键在于,在p2的后移过程中,当发现p2的值不等于p2.next时,p2.next可能与p2.next.next值相等,即p2.next同为一个需要被删除的重复节点,所以这时需要再次判断一下,并且如果p2.next确实需要被删除,需要修改当前temp(标记当前重复值的变量)的值。

代码

public class DeleteDuplicateNodes {
    public static ListNode<Integer> deleteDuplication(ListNode pHead){

        ListNode<Integer> root = pHead;
        ListNode<Integer> p1=null, p2=pHead;

        while(p2!=null && p2.next!=null){
            if(p2.next.val==p2.val){
                int temp = p2.val;
                while(p2!=null){
                    p2=p2.next;
                    if (p2==null) break;
                    if(p2.val!=temp){
                        if(p2.next==null || p2.val!=p2.next.val)
                            break;
                        else{
                            temp=p2.val;
                        }
                    }
                }
            }

            // 更改原链表
            if(p1!=null)p1.next=p2;
            else root=p2;

            // 将p1、p2后移
            p1=p2;
            if(p2!=null) p2=p2.next;
        }
        return root;
    }
}

    public static void main(String[] args) {
        ListNode list1 = new ListNode(1,2,3,3,4,4,5);
        list1.showValues();
        deleteDuplication(list1).showValues();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值