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

news2024/12/29 20:23:50

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

 解题思路:设置一个新的哑元节点result,作为头节点,将head中不重复地节点依次链接到哑元节点后面,最后返回result.next

  1. 初始值:
    1. result = new ListNode();
    2. prev = result
    3. current = head
    4. cnt = 0
  2. 如果current != null,则循环执行:
    1. 如果 current.next!=null && current.next.val == current.val:说明节点重复
      1. 令current = current.next
      2. cnt++:重复节点的数量加1
      3. 如果 cnt>1 &&(current.next==null || current.next.val != current.val):
        1. 此时说明有重复的节点,并且current已经到达最后一个重复的节点,但是后面的节点还有可能会出现重复,继续遍历后面的节点,
        2. current = current.next。
        3. cnt=0,重新计数
      4. continue,遍历下一个节点
    2. prev.next = current:将当前不重复的节点链接到新链表中。
    3. prev = current:更新前驱
    4. curent = current.next
    5. prev.next = null:因为current后面可能还会有重复的节点,所以prev的后继指向null,断开与current后面节点的链接

AC代码:

/**
 * Definition for singly-linked list.
 * 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 || head.next == null) {
            return head;
        }

        ListNode result = new ListNode();
        ListNode prev = result;
        ListNode current = head;
        int cnt = 0;
        while (current != null) {
            if (current.next != null && current.next.val == current.val) {
                current = current.next;
                cnt++;
                if (cnt > 0 && (current.next == null || current.next.val != current.val)) {
                    current = current.next;
                    cnt = 0;
                }
                continue;
            }

            prev.next = current;
            prev = current;
            current = current.next;
            prev.next=null;

        }

        return result.next;
    }
}

解法二:在头节点前添加一个哑元节点,初始时将current指向哑元节点,如果后面节点有重复的,就一直令current.next = current.next.next,丢弃中间重复的节点current.next,否则令current = current.next,指向下一个不重复的节点

AC代码:

public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode dummy = new ListNode(0, head);

        ListNode current = dummy;
        while (current.next != null && current.next.next != null) {
            if (current.next.val == current.next.next.val) {
                int value = current.next.val;
                while (current.next != null && current.next.val == value) {
                    current.next = current.next.next;
                }
            } else {
                current = current.next;
            }
        }

        return dummy.next;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/873446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dynamic CRM开发 - 实体介绍

实体简介 在CRM中,实体(Entity)是数据的基本载体,也是构建业务逻辑网络的基础节点。 实体可以理解为数据库中的一张表(实体中的字段对应数据库表的字段),比如创建一个实体存储客户信息,创建一个实体存储产品信息,产品实体里可以创建一个查找类型的字段(类似表的外键)…

尚医通(医院预约挂号系统)笔记

文章目录 一. 登录系统1. 手机登录1.1 业务流程1.2 代码1.3 JWT 2. 微信登陆2.1 业务流程2.2 代码2.3 OAthu2 3. 用户认证与网关整合 二. 预约挂号1. 业务流程及模块设计 一. 登录系统 1. 手机登录 1.1 业务流程 传入手机号和验证码校验手机号和验证码是否为空校验手机验证码…

阿里云新用户和老用户是如何界定的?产品首购资格是什么?

阿里云新用户条件是什么?针对新用户优惠有哪些?阿里云新用户怎么算?新用户购买云服务器、域名等更优惠,如何获取新用户特价资格?阿里云新用户是指从未购买阿里云产品的用户(域名除外)&#xff0…

《TCP IP网络编程》第十六章

第 16 章 关于 I/O 流分离的其他内容 16.1 分离 I/O 流 「分离 I/O 流」是一种常用表达。有 I/O 工具可区分二者,无论采用哪种方法,都可以认为是分离了 I/O 流。 2次 I/O 流分离: 第一种是第 10 章的「TCP I/O 过程」分离。通 shutdown(soc…

英语——时态

动词随着所表现出的时间而改变的形态,称为时态,包含以下12种 现在过去将来一般一般现在时一般过去时一般将来时进行现在进行时过去进行式将来进行时完成现在完成时过去完成时将来完成时完成进行现在完成进行时过去完成进行时将来完成进行时 1 现在时 …

考公-判断推理-类比推理

第七节课 例题 例题 例题 例题 目无全牛:很熟练 不以为然:不认为正确 不孚众望:不能让人信服 例题 步人后尘:走别人的老路 例题 见义勇为是助人为乐的一种 例题 例题-全同 例题 并列关系 例题 例题 例题 例题 进士…

C++QT教程3——手册4.11.1自带教程(笔记)——创建一个基于Qt Widget的应用程序

文章目录 创建一个基于Qt Widget的应用程序创建Text Finder项目素材文件 填补缺失的部分设计用户界面完成头文件完成源文件创建资源文件 编译和运行程序 参考文章 创建一个基于Qt Widget的应用程序 本教程介绍如何使用Qt Creator创建一个小型Qt应用程序,名为Text F…

docker — 容器网络

一、概述 Docker容器每次重启后容器ip是会发生变化的。 这也意味着如果容器间使用ip地址来进行通信的话,一旦有容器重启,重启的容器将不再能被访问到。 而Docker 网络就能够解决这个问题。 Docker 网络主要有以下两个作用: 容器间的互联…

阿里云轻量应用服务器_2核4G4M_2核2G3M_性能测评

阿里云轻量应用服务器2核2G3M带宽108元一年,系统盘为50GB高效云盘;轻量服务器2核4G4M带宽,60GB高效云盘297.98元12个月。目前轻量应用服务器只有2核2G和2核4G有活动,阿里云百科分享阿里云轻量应用服务器入口: 目录 阿…

动态优先权算法

1.设计目的与要求 1.1设计目的 通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。 1.2设计要求 本实验要求学生独立地用C或C语言编写一个简单的进程管理程序,其主要部分是进程调度。调度算法可由学生自行选择,如基于动态优先级的调度算法…

FL Studio 21 for macOS-21.1.0.3267中文直装版功能介绍及系统配置要求

FL Studio 21简称FL水果软件,全称是:Fruity Loops Studio编曲,由于其Logo长的比较像一款水果因此,在大家更多的是喜欢称他为水果萝卜,FL studio21是目前最新的版本,这是一款可以让你的计算机就像是一个全功能的录音室&…

ArcGIS Maps SDK for JavaScript系列之三:在Vue3中使用ArcGIS API加载三维地球

目录 SceneView类的常用属性SceneView类的常用方法vue3中使用SceneView类创建三维地球项目准备引入ArcGIS API创建Vue组件在OnMounted中调用初始化函数initArcGisMap创建Camera对象Camera的常用属性Camera的常用方法 要在Vue 3中使用ArcGIS API for JavaScript加载和展示三维地…

8.利用matlab完成 符号微积分和极限 (matlab程序)

1.简述 一、符号微积分 微积分的数值计算方法只能求出以数值表示的近似解,而无法得到以函数形式表示的解析解。在 MATLAB 中,可以通过符号运算获得微积分的解析解。 1. 符号极限 MATLAB 中求函数极限的函数是 limit,可用来求函数在指定点的…

Java 并发编程与CAS基本原理

一、Java并发基础知识 Java里的程序天生就是多线程的,那么有几种新启线程的方式? 两种,启动线程的方式只有: 1、X extends Thread;,然后X.start; 2、X implements Runnable;然后交给Thread运行。 Java…

IDEA的常用设置,让你更快速的编程

一、前言 在使用JetBrains的IntelliJ IDEA进行软件开发时,了解和正确配置一些常用设置是非常重要的。IDEA的强大功能和定制性使得开发过程更加高效和舒适。 在本文中,我们将介绍一些常用的IDEA设置,帮助您更好地利用IDEA进行开发。这些设置包…

Nonebot实战之编写插件1

前言 应粉丝群内粉丝要求,我也决定写一个Nonebot插件编写教程,从0开始教学。有些不对的地方也欢迎大家指正,修改。 开始 准备 合适的代码编辑器一定的python基础懂得提问的方式 代码编辑器 代码编辑器有很多种选择,比如 vsc…

基本逻辑门的工作原理、电路图、逻辑图、逻辑表达式等

与、或、与非、或非、异或门、三态门、OD门(OC门)和传输门等的结构与使用 逻辑门是基于半导体器件形成的,开始学习逻辑门之前应具备半导体器件的相关知识 可阅读如下文章进行先导学习 半导体器件: https://blog.csdn.net/weixi…

彻底卸载Android Studio

永恒的爱是永远恪守最初的诺言。 在安装Android Studio会有很多问题导致无法正常运行,多次下载AS多次错误后了解到,删除以下四个文件才能彻底卸载Android Studio。 第一个文件:.gradle 路径:C:\Users\yao(这里yao是本…

下载程序到西门子PLC

更多关于西门子S7-200PLC内容请查看:西门子200系列PLC学习课程大纲 下载西门子200PLC程序分以下两步: 一.编译程序 1. 如下图1-1所示,使用PPI电缆将PLC和电脑连接上,注意笔记本使用USB转PPI电缆,连接保证给PLC单独供…

什么是gRPC?

1. GRPC是google开源的rpc框架 2. 核心是一个.proto的服务描述文件 3. 添加依赖的grpc相关的包,配置IDEA的grpc插件,就可以很方便的生成调用代码 4. 通过在IDEA的protobuf插件上分别执行以下两个服务,就可以生成需要的调用代码 1&#xff…