LeetCode83 链表——删除排序链表中的重复元素 II

该博客主要介绍了如何解决一个链表问题,即删除已排序链表中所有重复的元素,保持链表升序排列。通过创建虚拟头节点,判断相邻节点值是否相等来确定重复元素,并进行删除操作。在遍历过程中,使用三个指针prev、cur和next,当cur.val等于next.val时,next会继续向后移动直到找到不相等的节点,此时prev将指向重复元素的前一个节点,删除重复部分。最终返回结果链表。
摘要由CSDN通过智能技术生成

删除排序链表中的重复元素 II

1、题目描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。
返回同样按升序排列的结果链表。
示例
在这里插入图片描述
在这里插入图片描述
提示

  • 链表中节点数目在范围 [0, 300] 内
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

2、思路

  • 1 创建虚拟头节点(该节点内部不存储具体元素,只做链表头)
    Node dummyHead=new Node(101);
    在这里插入图片描述
  • 2 判断重复元素
    当cur.val!=next.val时,prev,cur,next统一向后移动一位,
    当cur.val==next.val时,cur不动,next一直向下走,
    直到cur.val!=next.val,此时说明[cur,next)都是要删除的元素。
    在这里插入图片描述

此时:
prev–第一个重复节点的前驱
next–最后一个重复节点的后继
(prev,next)中间元素都是要删除的

  • 3 删除元素
    prev.next=next;
    在这里插入图片描述

3、代码

// 删除链表中所有重复节点,重复节点都不保留
public class num82 {
    // 101  1 2 3 3 4 4 5
    // 1.判断重复元素
    // 三个引用  prev cur next
    // prev=101 cur=1 next=2
    // if cur.val!=next.val  prev cur next都像后移动一个单位
    //prev=1 cur=2 next=3  继续
    // prev=2 cur=3 next=3  此时next继续向后移动,直到走到next.val!=cur.val,next走到第一个与cur不等得节点
    // 此时,prev是重复节点得前驱,next 重复节点得后继   prev到next之间的元素都是要删除的
    // 删除  prev.next=next;
    public ListNode deleteDuplicates(ListNode head) {
        // 创建虚拟头节点
        ListNode dummyHead=new ListNode(101);
        dummyHead.next=head;
        ListNode prev=dummyHead;
        ListNode cur=prev.next;
        while(cur!=null){
            ListNode next=cur.next;
            if(next==null){
                // 此时链表只有一个节点
                return dummyHead.next;
            }
            else{
                if(cur.val!=next.val){
                    // 三引用向后移动
                    prev=prev.next;
                    cur=cur.next;
                }
                else{
                    // 链表中不止一个节点
                    // 前面的if(next==null),只是判断刚开始的next,next会移动,所以此时还需要判断next是否为空
                    while(next!=null&&cur.val==next.val){
                        next=next.next;
                    }
                }
                // 此时prev走向第一个重复节点的前驱
                // next指向重复节点得后继
                prev.next=next;
                // 更新cur的指向
                cur=next;
            }
        }
        return dummyHead.next;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值