首页 > 其他分享 >82. 删除排序链表中的重复元素 II

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

时间:2024-07-13 22:29:57浏览次数:14  
标签:II head ListNode cur val next 链表 82

82. 删除排序链表中的重复元素 II
是一个有序链表

错误代码

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        ListNode dummy = new ListNode();
        dummy.next = head;
        while(head != null && head.next != null) {
            if (head.val == head.next.val) {
                head.next = head.next.next;
            }
            head = head.next;
        }
        return dummy.next;
    }
}

这段代码的目的是删除单链表中的所有重复元素,但是它只能删除连续且相邻的重复元素,并且存在一个逻辑错误。错误在于当发现重复元素时,代码没有保持当前节点不变以继续检查后续是否还有重复元素,而是直接移动到了下一个节点。这会导致在一系列连续重复元素中,只删除了第一个重复元素后的一个元素,而不是删除所有重复的元素。

例如,对于链表 1 -> 2 -> 2 -> 3,按照这段代码的逻辑,处理后的链表将会是 1 -> 2 -> 3,这是正确的。但是,对于链表 1 -> 2 -> 2 -> 2 -> 3,处理后的链表将会是 1 -> 2 -> 2 -> 3,这是不正确的,因为它没有删除所有的重复元素。

为了修正这个问题,我们需要在发现重复元素时,不移动 head 指针,直到确保没有更多的重复元素。以下是修正后的代码:

public class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return null;
        
        ListNode dummy = new ListNode(0, head);
        ListNode cur = dummy;
        
        while (cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                int dupVal = cur.next.val;
                while (cur.next != null && cur.next.val == dupVal) {
                    cur.next = cur.next.next; // 删除重复元素
                }
            } else {
                cur = cur.next; // 没有重复,移动到下一个节点
            }
        }
        
        return dummy.next;
    }
}

修正后的代码逻辑:

  1. 创建一个哑节点 dummy,其 next 指向 head,以简化边界条件处理。
  2. 使用 cur 指针遍历链表,初始时指向 dummy
  3. cur 的下一个节点和下下一个节点不为空时,检查这两个节点的值是否相等。
    • 如果相等,说明有重复元素。记录重复的值 dupVal,然后使用一个循环删除所有值为 dupVal 的节点。
    • 如果不相等,说明当前节点不重复,cur 指针移动到下一个节点。
  4. 返回 dummy.next,即新链表的头节点。

标签:II,head,ListNode,cur,val,next,链表,82
From: https://www.cnblogs.com/qianingmeng/p/18300843

相关文章

  • LCR 024. 反转链表
    LCR024.反转链表1、迭代这段代码是一个用于反转单链表的Java类。下面是对代码的详细解释:classSolution{publicListNodereverseList(ListNodehead){ListNodeprev=null;//初始化前一个节点为null,因为反转后链表的最后一个节点的next应该是null......
  • 代码随想录day 23 组合总和 | 组合总和II | 分割回文串
    组合总和组合总和解题思路利用回溯算法进行遍历,由于数组内的数字可以重复调用,因此在套用模板进行遍历时,下一次递归的startIndex是当前遍历的下标。剪枝操作则是通过比较和是否大于目标值,如果大于则不进行下一次的递归,以此来减少循环遍历的次数,这个条件需要加到for循环中。知......
  • 数据结构与算法学习day4之单向链表
    1.单向链表的的定义链表是有序的列表,这是它在内存中的存储,如下图所示:链表是以节点的形式存储的,是链式存储每个节点都包含两个部分,一个是data域,一个是next域指向下一个节点每个节点不一定是连续存储链表分为带头节点和不带头节点2.单向链表的实现思路(1)添加添加节点的......
  • 链表操作
    定义(c语言)struct ListNode{      int val;      struct ListNode *next;}ListNode;切记,使用链表时一定要开辟空间。    struct ListNode *l1 = (struct ListNode *) malloc (sizeof(ListNode));    struct ListNode *p1 = l1;   ......
  • 【华为OD】D卷真题100分:阿里巴巴找黄金宝箱(III) python代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客Java、JS、python、C、C++代码实现:【华为OD】D卷真题100分:阿里巴巴找黄金宝箱(III)Java代码实现[思路+代......
  • P2482 [SDOI2010] 猪国杀 代码(暂未完成)
    #include<bits/stdc++.h>usingnamespacestd;namespacework{constintmaxPlayerNumber=11;intn,m,top=1;//玩家数,牌堆中的牌数,目前的牌堆顶unordered_map<string,int>transCard;//牌型编号unordered_map<string,int>transRole;//角色编号vector<int>c......
  • 代码随想录day22 组合 | 组合总和III | 电话号码的字母组合 |
    组合组合解题思路利用回溯算法来暴力枚举所有可能性。这里利用了代码随想录的解题模板即可。剪枝方面,由于某些情况下(如k=n)不需要遍历所有的可能性,因此我们要适当修改一下每次循环遍历的元素个数来进行优化知识点回溯心得如果知道如何将此类问题转换为一个n叉树,就会很......
  • 力扣 682. 棒球比赛
    题目内容你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则:整数 x -表示本......
  • 信息学奥赛初赛天天练-45-CSP-J2020阅读程序1-字符数组默认值、字符串长度、字符数组
    PDF文档公众号回复关键字:202407122020CSP-J阅读程序11阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×。除特殊说明外,判断题1.5分,选择题3分,共计40分)01#include<cstdlib>02#include<iostream>03usingnamespacestd;0405ch......
  • Linux下IIO子系统驱动
    1引入IIO子系统随着手机、物联网、工业物联网和可穿戴设备的爆发,传感器的需求越来越多。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等,这些传感器本质上都是ADC。这些传感器对外通过IIC或者SPI接口来发送ADC转换后的原始数据。Linux内核为了管理......