删除排序链表的重复元素I和II,多种解法和思考

news2025/1/23 11:55:18
删除排序链表的重复元素I

https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/

一个循环就可以了,如果当前节点和下一个节点值一样,当前节点不移动让next后移动一个,如果不一样则当前节点后移。

在这里插入图片描述

一个循环就可以了,如果当前节点和下一个节点值一样,当前节点不移动让next后移动一个,如果不一样则当前节点后移。

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null)
            return head;
        ListNode cur = head;
        while(cur.next!=null){
            if(cur.val==cur.next.val)
                cur.next=cur.next.next;
            else
                cur=cur.next;
        }
        return head;
    }
}
删除排序链表的重复元素II

https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/description/

在这里插入图片描述

学习到的新思想:

1、当不想要某个节点时,可以先找到前置节点然后cur.next=cur.next.next,这样子前面一个节点.next就可以跳过这个节点了,不再需要删除节点再定义两个节点了。为什么不能cur=cur.next;cur的空间始终存在,cur.next只是把空间指向了下一个节点罢了。

PS:当前指针不好改内存,.next指向的改变才是关键所在

2、当某个值得节点都不想要的时候,不要每一次都两个节点进行比较,看是不是两个节点的值一样。可以先开一个变量记录下来节点的值,然后再用1,就可以把所有节点全删了

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null) return null;
        ListNode dummyNode = new ListNode(0,head);
        ListNode cur = dummyNode;
        //为什么可以指两次,其实如果不存在.next.next这个节点也不用删掉不是吗
        //这样子的变动是在链表head上面进行的
        //这里有一步很妙,先拿一个变量记录下来当前节点,然后就可以直接抛弃当前所有
        //节点,不要在两个节点进行比较
        while(cur.next!=null&&cur.next.next!=null){
            int val = cur.next.val;
            if(cur.next.val==cur.next.next.val)
                while(cur.next!=null&&cur.next.val==val)
                    cur.next=cur.next.next;                
            else
                cur = cur.next;
        }
        return dummyNode.next;
    }
}

自己的写法,单循环双节点计数法,先得到前面一个节点和当前节点,然后找到计数为1并且前后两个节点值不一样的位置,双节点再移动,又臭又长。

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null) return null;
        //可能会有表头节点全部删除完了的情况,我们依旧采用虚拟节点的写法
        ListNode dummyNode = new ListNode(0,head);
        ListNode pre = dummyNode;
        ListNode cur = dummyNode.next;
        //删除节点,让pre指向下一个满足条件的节点即可
        int flag = 1;
        //计数器flag为1时候就可以赋值了
        while(cur.next!=null){
            if(cur.val==cur.next.val){
                flag++;
                cur.next=cur.next.next;
            }
            else{ 
                if(flag==1){
                    pre.next=cur;
                    cur=cur.next;
                    pre=pre.next;   
                }
                else{
                    cur=cur.next;
                    flag=1;  
                }
            }
        }
        if(flag==1) pre.next=cur;
        else pre.next=null;
        return dummyNode.next;
    }
}

优化了一下过程:

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head==null) return null;
        ListNode dummyNode = new ListNode(0,head);
        ListNode pre = dummyNode;
        ListNode cur = head;
        while(cur!=null&&cur.next!=null){
            if(cur.val==cur.next.val){
                int val = cur.val;
                while(cur!=null&&cur.val==val)
                    cur=cur.next;
            }
            else{
                pre.next=cur;
                pre=pre.next;
                cur=cur.next;
            }
        }
        pre.next=cur;
        return dummyNode.next;
    }
}

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

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

相关文章

mysql8报sql_mode=only_full_group_by(存储过程一直报)

1:修改数据库配置(重启失效) select global.sql_mode;会打印如下信息 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROU…

水果编曲软件FL Studio21最新中文版本2023年最新FL 21中文版如何快速入门教程

水果编曲软件FL Studio介绍 各位,大家晚上好,今天给大家带来最新最新2023水果编曲软件FL Studio 21中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件,这款软件相信…

PyQt基础_007_ 按钮类控件QCombox

import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class ComboxDemo(QWidget):def __init__(self, parentNone):super(ComboxDemo, self).__init__(parent)self.setWindowTitle("combox 例子") self.resize(300, 90) …

【智能算法】改进粒子群优化算法及对比分析

程序名称:改进粒子群优化算法及对比分析 实现平台:matlab 代码简介:基本粒子群算法(BPSO)中,每个优化问题的解都可以看作粒子在搜索空间中的位置,粒子通过飞行速度决定它们的搜索方向和搜索范围,粒子群通…

C语言基础--#if与#endif

目录 一、C语言中的 #if()和 #end if 用法 1. #if 表达式 程序段 #endif 形式 2. #ifdef标示符 标识符 #endif 形式 3. #if 0/ #if 1 #endif 形式 4. \可用于一行的结尾,表示本行与下一行连接起来 二、xTaskCreate函数 三、指针相关…

投资者要不要更换黄金代理?

有一些投资者会问,要不要更换自己的黄金代理?笔者认为,换代理这个问题有一些东西需要关注。因此,我们今天就来讨论一下投资者该不该更改代理?如果要换,新的代理如何选择? 其实很简单&#xff0c…

数据结构-构造哈夫曼树【详解+代码+图示】一文解惑!

哈夫曼树 (Huffman Tree) 文章目录 哈夫曼树 (Huffman Tree)导论构造哈夫曼树语言描绘图形化理解 证明结论代码实现测试结果对照总结 导论 我们在学习哈夫曼树之前需要先了解 什么是哈夫曼树? 哈夫曼树 是一种最优树,是一类带权路径长度最短的二叉树,通过哈夫曼算法可以构建一…

虚幻学习笔记7—蓝图接口

一、前言 蓝图接口就是可以在蓝图中实现的接口,有它方便的地方,可以很方便的调用到实现了接口的函数。 二、实现 2.1、创建一个蓝图接口 1)可以添加多个函数。 2)函数在蓝图接口中只能规定输入和输出参数。 只有输入参数的可以…

Vue3生命周期函数(简述题)

1.图示 2.说明 3.补充 1.在vue3组合式API中,我们需要将生命周期函数先导入,然后才能使用。 import {onMounted} from vue2.beforeCreate和created被setup()方法所代替

Revit导出3D模型插件【GLTF|OBJ|DAE|STL|PLY|OFF|XYZ】

3dconvert_for_revit插件是NSDT 3DConvert工具集中的一种,可以快速将Revit模型导出为8种目标格式:GLTF、OBJ、GLB、DAE、STL、OFF、XYZ和PLY。 用户在进行格式转换之前,需要先下载安装对应Revit版本的插件。 NSDT在线工具推荐: T…

RabbitMQ消息模型之发布订阅Publish-Subscribe

发布订阅模型 Publish/Subscribe 发布订阅模型也称为广播模型,交换机类型需要指定为Fanout,正如从名称中猜到的那样,它是将接收到的所有消息广播到它知道的所有队列中。每个消费者都监听自己的队列,所以同一个消息,会…

多模块项目打包部署

目录结构 这些模块间相互依赖,打包的时候打父模块,就是带root的这个 先clean,再package,就跟一般的项目一样了。 有可能遇到报错Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test&#xff…

[Java]JUC并发编程

JUC并发编程 一、什么是JUC 使用到 java.util 工具包、包、分类 二、线程和进程 进程:一个正在运行的程序,QQ.exe Music.exe 程序的集合; 一个进程往往可以包含多个线程,至少包含一个! Java默认有两个线程&#x…

微服务链路追踪组件SkyWalking实战

概述 微服务调用存在的问题 串联调用链路,快速定位问题;理清服务之间的依赖关系;微服务接口性能分析;业务流程调用处理顺序; 全链路追踪:对请求源头到底层服务的调用链路中间的所有环节进行监控。 链路…

短 URL 生成器设计:百亿短 URL 怎样做到无冲突?

Java全能学习面试指南:https://javaxiaobear.cn 我们先来看看,当高并发遇到海量数据处理时的架构。在社交媒体上,人们经常需要分享一些 URL,但是有些 URL 可能会很长,比如: https://time.geekbang.org/hyb…

C#图像处理OpenCV开发指南(CVStar,03)——基于.NET 6的图像处理桌面程序开发实践第一步

1 Visual Studio 2022 开发基于.NET 6的OpenCV桌面程序 1.1 为什么选择.NET 6开发桌面应用? 选择 .NET 6(最早称为 .NET Core)而非 Frameworks.NET 的理由是:(1)跨平台;已经支持Windows,Linux…

PyQt基础_008_ 按钮类控件QSpinbox

基本操作 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class spindemo(QWidget):def __init__(self, parentNone):super(spindemo, self).__init__(parent)self.setWindowTitle("SpinBox 例子")self.resize(300,…

错误 LNK2001 无法解析的外部符号 __imp__CrtDbgReport

”属性“ -->”设置“ --> ”c“ – > ”代码生成“ --> ”运行库“ ,将 ”多线程(MT)“ 改为 ”多线程(MTD)“。

JavaScript包装类型

前端面试大全JavaScript包装类型 🌟经典真题 🌟包装类型 🌟真题解答 🌟总结 🌟经典真题 是否了解 JavaScript 中的包装类型? 🌟包装类型 在 ES 中,数据的分类分为基本数据类型…

NCo3.1(08) - Nco3 服务器端编程

本篇博文不再重复ABAP调用外部服务器的基础,只介绍 NCo3 开发的过程和要点。需要了解相关知识点的小伙伴们自行参考: SAP接口编程 之JCo3.0系列(06) - Jco服务器端编程 PyRFC 服务器端编程要点 创建项目 新建一个 Console 项目,选择 .Net …