可视化图解算法:删除有序(排序)链表中重复的元素-II

1. 题目

描述

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。 例如: 给出的链表为1→2→3→3→4→4→5, 返回1→2→5. 给出的链表为1→1→1→2→3 返回2→3.

数据范围:链表长度 0≤n≤100000 ,链表中的值满足 ∣val∣≤1000

要求:空间复杂度 O(n),时间复杂度 O(n)

进阶:空间复杂度 O(1),时间复杂度 O(n)

示例1

输入:

{1,2,2}

返回值:

{1}

示例2

输入:

{}

返回值:

{}

2. 解题思路

本题要求删除重复的元素即在链表中重复的元素都会被删除,由于重复的元素也有可能是头结点,因此需要定义一个链表的虚拟头结点,虚拟头结点的指针域指向链表的头结点。

假如链表结构如下图所示:

这时可以通过以下步骤完成链表重复元素的删除。

步骤一:定义虚拟头结点、指针变量。

cur :链表节点衔接指针(当前操作的节点);

nxt1:操作的下一个节点;

nxt2 :操作的下下一个节点。

步骤二:循环删除链表的重复节点。

此时,nxt1与nxt2对应的节点值都是1(重复的元素),移动nxt2。

此时,nxt1与nxt2对应的节点值还是1(重复的元素),移动nxt2。

这时,nxt1的节点值是1,nxt2的值是2,需将已经检查出重复的元素1删除。删除重复元素1可以通过更改cur当前节点的指针域,让它指向nxt2,这样就可以将多个1节点删除。

之后再移动nxt1与nxt2,使得nxt1始终指向当前操作节点cur的下一个节点;nxt2始终指向当前操作节点cur的下下一个节点。

ntx1 = cur.next # 下一个节点

ntx2 = cur.next.next # 下下一个节点

此时,nxt1与ntx2对应的节点值都是2(重复的元素),移动nxt2。

这时,nxt1的节点值是2,nxt2的值是3,需将已经检查出重复的元素2删除。删除重复元素2可以通过更改cur当前节点的指针域,让它指向nxt2,这样就可以将多个2节点删除。

之后再移动nxt1与nxt2,这时发现nxt1与nxt2中有一个为Null,循环退出(重复元素删除完成)。

步骤三:返回链表中无重复节点组成的链表头结点。

虚拟头节点的下一个节点就是需要返回的链表头节点,将其返回。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

  • Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1370403

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1366847

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364604

3. 编码实现

核心伪代码如下:

函数 删除重复节点(头节点 head) 返回 链表节点:如果 head 为空:返回 head//1. 定义虚拟头结点、指针变量创建虚拟头节点 tmp_head,值为 -1tmp_head的下一个节点指向 head当前节点 cur 指向 tmp_head//2. 循环删除链表的重复节点当 cur的下一个节点 不为空 且 cur的下一个节点的下一个节点 不为空 时,循环执行:ntx1 = cur的下一个节点ntx2 = cur的下一个节点的下一个节点如果 ntx1的值 == ntx2的值:val = ntx1的值当 ntx2 不为空 且 ntx2的值 == val 时,循环执行:ntx2 = ntx2的下一个节点cur的下一个节点 = ntx2  # 跳过所有重复节点否则:cur = cur的下一个节点  # 移动指针到下一个非重复节点// 3.返回链表中无重复节点组成的链表头结点返回 tmp_head的下一个节点  # 返回处理后的链表头节点

具体完整代码你可以参考下面视频的详细讲解。

  • Python版本:数据结构笔试面试算法-Python语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Python语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1370403

  • Java版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1366847

  • Golang版本:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1364604

4.小结

本题要求删除重复的元素即在链表中重复的元素都会被删除,由于重复的元素也有可能是头结点,因此需要定义一个链表的虚拟头结点,虚拟头结点的指针域指向链表的头结点。

这时可以通过以下步骤完成链表重复元素的删除。(1)定义虚拟头结点、指针变量;(2)循环删除链表的重复节点;(3)返回链表中无重复节点组成的链表头结点。


《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

✅ 链表 ✅ 二叉树 ✅二分查找、排序 ✅ 堆、栈、队列 ✅回溯算法 ✅ 哈希算法 ✅ 动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

  • Python编码实现:哔哩哔哩_bilibilihttps://www.bilibili.com/cheese/play/ep1509965

  • Java编码实现:数据结构笔试面试算法-Java语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Java语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1510007

  • Golang编码实现:数据结构笔试面试算法-Go语言版_哔哩哔哩_bilibili数据结构笔试面试算法-Go语言版,bilibili课堂,哔哩哔哩课堂,哔哩哔哩,Bilibili,B站,弹幕https://www.bilibili.com/cheese/play/ep1509945

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:千淘万漉虽辛苦,吹尽狂沙始到金。

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

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

相关文章

【leetcode刷题日记】lc.53-最大子数组和

目录 1.题目 2.代码 1.题目 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-…

树莓派超全系列文档--(7)RaspberryOS播放音频和视频

播放音频和视频 播放音频和视频VLC 媒体播放器vlc GUIvlc CLI使用 cvlc 在没有图形用户界面的情况下播放媒体 在 Raspberry Pi OS Lite 上播放音频和视频指定音频输出设备指定视频输出设备同时指定音频和视频输出设备提高数据流播放性能 文章来源: http://raspberr…

算法250327题目

1114: 4006 AB问题 题目描述 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号,隔开。 现在请计算AB的结果,并以正常形式输出。 输入 输入包含多组数据,每组数据占一行,由两个整数A和B组成&am…

Wireshark学习

Wireshark简介 抓包前 1.打开wireshark得到下面的界面 2.选择菜单栏上捕获-> 选项,勾选WLAN网卡(这里需要根据各自电脑网卡使用情况选择,简单的办法可以看使用的IP对应的网卡)。点击开始。启动抓包。 3.wireshark启动后&am…

[OS_4] 数学视角 | 多状态 | 模型检查器 | 程序验证(math)

程序 状态机 gdb 单步执行 状态迁移 状态里有什么?gdb 可以打印有一些特殊的状态迁移 硬件 状态机 指令执行 状态迁移 从 CPU Reset 开始执行 FirmwareFirmware 加载操作系统 (程序) 操作系统 状态机 (毫无疑问) 程序是一种真正意义上的 “数学严格” 的…

互联网的“神经中枢”域名根服务器是如何演变的?

互联网如同一条隐形的纽带,将全球数十亿人的生活和工作紧密相连。而在这庞大的网络体系中,域名根服务器则是支撑其平稳运行的“神经中枢”。那么域名根服务器是如何演变的呢? 一、域名根服务器互联网的“地址簿” 想象一下,当你…

【sylar-webserver】6 IO协程调度模块

文章目录 设计知识点 设计 IO协程调度模块,整个项目里最重要的模块~ 和 协程调度模块 相比,增加了 IO 事件的 触发条件。 所以需要重新封装 Event 事件, 通过 epoll_wait 监测触发事件(重新实现了idle),…

6.2、认证主要产品与应用

目录 认证主要产品认证产品主要技术指标认证技术应用认证技术应用 - 校园网应用认证技术应用 - 网络路由认证认证技术应用 - 用户登录设备认证技术应用 - 人脸识别门禁与eID 认证主要产品 应用认证产品主要形态有三种,硬件模式、软件模式和软硬相结合。硬件比如说认…

一套SaaS多租户医疗云his源码,基于云计算的医院信息管理系统(云HIS)

基于云计算的医院信息管理系统(云HIS),通过SaaS服务模式提供。这种云HIS系统设计考虑了模板化、配置化、智能化和可扩展性,覆盖了基层医疗机构的核心工作流程,并且能够与监管系统无缝对接,满足未来的扩展需…

人工智能技术全景图谱:从基础理论到前沿应用

人工智能技术全景图谱:从基础理论到前沿应用 一、AI发展历程与学科体系 1.1 人工智能三大学派 符号主义(Symbolicism) 逻辑推理:一阶谓词逻辑知识表示:语义网络、框架系统 连接主义(Connectionism&#…

基于杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法的多个无人机协同路径规划(可以自定义无人机数量及起始点),MATLAB代码

一、杜鹃鸟鲶鱼优化算法 杜鹃鸟鲶鱼优化(Cuckoo Catfish Optimizer,CCO)算法模拟了杜鹃鸟鲶鱼的搜索、捕食和寄生慈鲷行为。该算法的早期迭代侧重于执行多维包络搜索策略和压缩空间策略,并结合辅助搜索策略来有效限制慈鳔的逃逸空…

FPGA_DDS_IP核

接下来对FPGA的DDS的ip核进行学习。 首先对DDS需要有些了解 DDS信号发生器采用直接数字频率合成(Direct Digital Synthesis,简称DDS)技术,简单来说就是 需要一个系统频率和一个输入的数字数据 ,用这个系统频率计算出…

dbeaver连接mongodb 插入日期变成了字符串

dbeaver插入mongodb数据 日期默认使用ISODate处理,但是插入数据以后实际上是ISODate(2025-03-03T03:25:19.640Z)字符串 INSERT INTO xxx.aaa (_id, chatId, buddyId, pId, lastChatId, inspiration, createTime, modelType, version, selectedInspiration, _class)…

微服务管理 - NACOS学习

为什么了解,工作中会使用这个工具进行微服务管理。 入门介绍: Nacos 是阿里巴巴开源的一款专注于动态服务发现、配置管理和服务管理的平台,主要用于简化云原生应用架构中的微服务开发与运维。它帮助开发者实现服务的自动注册与发现、实时配置…

外贸独立站相关知识扫盲

常见的外贸独立站类型 B2B外贸独立站:主要面向企业客户,展示公司产品、服务和解决方案,促进企业间贸易。例如,使用WordPress搭建的B2B外贸独立站,可以灵活展示产品信息、发布行业资讯、提供在线询盘功能等。 B2C外贸…

libpng-1.6.47-windows编译

本文操作按照《c&c开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。 c&c开源库编译指南:https://blog.csdn.net/binary0006/article/details/144086155 本文章中的源代码已…

[250324] Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!| Wine 10.4 发布!

目录 Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft!Wine 10.4 发布! Kafka 4.0.0 版本发布:告别 ZooKeeper,拥抱 KRaft! 近日,Apache Kafka 4.0.0 正式发布!这是一个…

linux安装配置Nacos

环境:centos7、mysql8.0、nacos2.5.1 1.下载Nacos安装包 https://github.com/alibaba/nacos/releases?spm5238cd80.72a042d5.0.0.46bacd36C42EfG 我这边选的是最新的稳定版本2.5.1 2. 放到 linux 服务器中解压安装 解压 tar -xvf nacos-server-2.5.1.tar.gz 进入…

元宇宙浪潮下,数字孪生如何“乘风破浪”?

在当今科技飞速发展的时代,元宇宙的概念如同一颗璀璨的新星,吸引了全球的目光。元宇宙被描绘为一个平行于现实世界、又与现实世界相互影响且始终在线的虚拟空间,它整合了多种前沿技术,为人们带来沉浸式的交互体验。而数字孪生&…

[Effective C++]条款24:若所有参数皆需类型转换,请为此采用non-menber函数

. 1、操作符重载&隐式类型转换 C中,操作符重载可以通过成员函数或非成员函数来实现。当操作符重载是成员函数时,左操作数必须是该类的对象。如果左操作数不是该类的对象,而是需要进行隐式转换的类型,编译器将无法找到匹配的成…