算法的学习笔记—删除链表中重复的结点(牛客JZ76)

news2024/9/20 20:43:07

img

😀前言
在链表操作中,删除重复节点是一个常见的问题。特别是在排序链表中,连续的重复节点不仅会影响链表的结构,还会带来额外的复杂度。本文将介绍一种高效的算法,用于删除链表中所有重复的节点,并保留链表中仅出现一次的节点。本文以 Java 语言为例,进行详细的解读与实现。

🏠个人主页:尘觉主页

文章目录

  • 😆删除链表中重复的结点
    • 🥰题目描述
      • 🤭示例1
      • 🤭示例2
    • 😊解题思路
    • 😁代码实现
      • 😀代码解析
      • 😆示例分析
      • 😆时间与空间复杂度
    • 😄总结

😆删除链表中重复的结点

牛客网

🥰题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。

示例
输入:1 -> 2 -> 2 -> 3 -> 3 -> 4
输出:1 -> 4
在上述例子中,节点 2 和节点 3 是重复的,因此它们及其所有的重复项都被删除,最终的链表只剩下 1 和 4。

数据范围:链表长度满足 0≤n≤1000 ,链表中的值满足 1≤val≤1000
进阶:空间复杂度 O(n) ,时间复杂度 O(n)

例如输入{1,2,2,3,2,4}时,对应的输出为{1,4},对应的输入输出链表如下图所示:

🤭示例1

输入:{1,2,3,3,4,4,5}
返回值:{1,2,5}

🤭示例2

输入:{1,1,1,8}
返回值:{8}

17e301df-52e8-4886-b593-841a16d13e44

😊解题思路

为了有效删除链表中的重复节点,可以采用递归的方法来遍历链表,并在过程中删除那些重复的节点。具体步骤如下:

  1. 递归处理链表:从链表头开始遍历链表,如果当前节点的值与其下一个节点的值相同,则说明当前节点是重复的。此时,我们需要跳过所有重复节点,将指针直接指向下一个不重复的节点。
  2. 删除重复节点:对于重复节点,通过递归调用,将指针指向第一个不重复的节点,从而删除所有重复节点。
  3. 保留唯一节点:如果当前节点的值与下一个节点的值不同,则当前节点是唯一的,可以保留。然后递归处理链表的其余部分。

😁代码实现

以下是基于上述思路的 Java 代码实现:

public class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null || pHead.next == null)
            return pHead;
        
        ListNode next = pHead.next;
        
        // 当前节点是重复节点
        if (pHead.val == next.val) {
            // 跳过所有重复节点
            while (next != null && pHead.val == next.val) {
                next = next.next;
            }
            // 递归删除后续的重复节点
            return deleteDuplication(next);
        } 
        // 当前节点不是重复节点
        else {
            // 递归处理下一个节点
            pHead.next = deleteDuplication(pHead.next);
            return pHead;
        }
    }
}

😀代码解析

  1. 入口方法 deleteDuplication
    • 首先判断链表是否为空,或者链表是否只有一个节点。如果是这种情况,直接返回当前链表头节点,因为此时没有重复节点需要处理。
    • 取得当前节点的下一个节点 next,并判断当前节点与 next 是否具有相同的值。
  2. 处理重复节点
    • 如果当前节点的值与 next 的值相同,则说明当前节点是重复节点,需要删除。
    • 通过循环跳过所有值相同的节点,直到找到一个值不同的节点。然后,递归调用 deleteDuplication,处理下一个非重复节点。
  3. 处理非重复节点
    • 如果当前节点的值与 next 的值不同,则当前节点是唯一的。此时,只需递归处理链表的其余部分,并将当前节点连接到后续处理的结果上。

😆示例分析

假设输入链表为 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5,我们可以通过递归逐步删除重复节点,最终得到结果链表 1 -> 2 -> 5

  1. 初始链表为 1 -> 2 -> 3 -> 3 -> 4 -> 4 -> 5。从头节点 1 开始,1 和 2 没有重复节点,因此保留。
  2. 遇到节点 3,发现其后面跟着另一个 3,因此跳过所有的 3,递归处理下一个不重复节点 4。
  3. 节点 4 与后面的节点值相同,也被删除,最后只保留节点 5。

😆时间与空间复杂度

  • 时间复杂度:O(N),其中 N 是链表的节点数。每个节点只会被遍历一次,因此时间复杂度是线性的。
  • 空间复杂度:O(N),递归调用栈的深度与链表长度有关,因此空间复杂度为 O(N)。

😄总结

本文介绍了一种删除排序链表中重复节点的高效算法。通过递归的方式,算法能够有效地删除所有重复节点,并保留链表中仅出现一次的节点。此方法的实现简单且易于理解,同时在时间和空间复杂度方面表现优异,适用于处理大规模数据链表中的重复节点问题。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

GPT-4o mini发布,轻量级大模型如何颠覆AI的未来?

从巨无霸到小巨人:GPT-4o Mini的创新之路 ©作者|潇潇 来源|神州问学 引言 随着人工智能技术的飞速进步,AI领域的竞争日益激烈,大型模型的发布几乎成为常态。然而,这些庞大的模型通常需要大量的计算资源和存储空间&#xff…

如何使用Zabbix API批量修正主机名称

作者 乐维社区(forum.lwops.cn) 许远 先说为什么要修正? 这其实源自于Ansible安装zabbix agent的一个小Bug:有小伙伴发现,利用ansible批量安装zabbix agent后,zabbix系统上显示的主机名出错了,主…

疫苗发布和接种预约系统

TOC springboot173疫苗发布和接种预约系统 第一章 绪论** 1.1 研究背景 在现在社会,对于信息处理方面,是有很高的要求的,因为信息的产生是无时无刻的,并且信息产生的数量是呈几何形式的增加,而增加的信息如何存储以…

【Next】初识 Next

概述 在Reactr中创建SSR应用,需要调用 ReactDOM.hydrateRoot 函数,而不是 ReactDOM.createRoot。 createRoot:创建一个Root,接着调用其 render 函数将 App 直接加载到页面上hydrateRoot:创建水合 Root, 是在激活的模式下渲染 App 服务端可用 ReactDOM…

如何在 Odoo 16 中修改现有网页

在 Odoo 中,网页是指在 Odoo 网站上可访问的特定页面或 URL。Odoo 中的网页是通过内置网站模块创建和管理的,该模块允许您设计和自定义网页的内容、布局和功能。 Odoo 中的网页是您网站的构建块,可用于呈现信息、展示产品或服务、通过表单收…

「MyBatis」实现留言板

效果预览 界面长这样,每次提交之后,会在下面生成一条记录,刷新页面或者关掉后重新打开,这些记录仍然存在 思路 我们需要在数据库中保存一条一条的消息,那就需要一个类 Data public class MessageInfo {private Integ…

【笔记】Swin-Transformer 的计算量与Transformer的计算量的对比:前者通过使用新颖的窗口技巧,将后者的高阶项变为低阶,大大降低了计算量

补充1: 局部窗口内的自注意力(W-MSA): 在 Swin Transformer 中,输入特征图被划分为多个小的窗口(例如 7x7 的窗口)。在每个窗口内,计算自注意力机制(W-MSA, Window-based Multi-Head…

【新手入门必看】字符串

一、初识字符串 1、定义的几种格式 和整型数组一样&#xff1a;int data[]{1,2,3,4,5}; char str[]{h,e,l,l,o}; 之前我们学过数组名就等于地址&#xff0c;那么也可以通过指针的方式来定义char *pchar"hello"; #include <stdio.h>int main(int arg…

C++-类与对象(中上篇)

一、目标 1. 类的 6 个默认成员函数 2. 构造函数 3. 析构函数 二、对目标的介绍 1. 类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生…

Spring源码-源码层面讲解bean标签添加了lookup-method和replaced-method标签之后源码执行流程,以及对象实例化的流程

bean.xml文件添加lookup-method和replaced-method标签 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…

怎么转换视频格式?常见的3种格式转换方法

随着手机等工具的普及&#xff0c;拍视频已经变成我们日常生活娱乐的方式。在享受拍视频带来的快乐同时&#xff0c;我们需要灵活运用格式转换来满足不同的播放设备和使用场景的需求。怎么转换视频格式&#xff1f;很多人为了视频格式转换这个问题烦恼。 视频格式转换&#xf…

ComfyUI - 在服务器中部署 AIGC 绘画的 ComfyUI 工具 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141140498 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 ComfyU…

PhpStorm完全配置指南:打造高效PHP开发环境!

Phpstorm环境配置与应用&#xff0c;具体包括安装PhpStorm、配置PHP运行环境、Apache集成、调试和部署等步骤。下面将详细展开每个步骤的具体操作和注意事项。 PhpStorm的下载与安装 下载地址&#xff1a;访问PhpStorm的官网下载地址&#xff0c;选择合适的版本进行下载。建议选…

【零基础学习CAPL语法】——TestWaitForMessage:等待指定报文

文章目录 1.函数介绍2.实例1.函数介绍 TestWaitForMessage——等待指定报文 long TestWaitForMessage(dbMessage aMessage, dword aTimeout); long TestWaitForMessage(dword aMessageId, dword aTimeout); long TestWaitForMessage(dword aTimeout); 若在aTimeout时间内等到了…

练习题PHP5.6+变长参数 ⇒ usort回调后门 ⇒ 任意代码执行

突破长度限制 使用usort上传后门 usort — 使用用户自定义的比较函数对数组中的值进行排序 paramusort(...$GET); ...为php设置可变长参数 在url地址栏中输入[]test&1[]phpinfo();&2assert 包含了phpiinfo&#xff08;&#xff09;命令执行 结合usort使用 assert…

leetcode695.岛屿的最大面积

题目描述 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 岛屿的面积是岛上值为 1 的单元格的数目。 计算并…

小阿轩yx-Docker 基本管理

小阿轩yx-Docker 基本管理 &#xff08;镜像制作与管理&#xff09; Docker 镜像管理 Docker 镜像除了是 Docker 的核心技术&#xff0c;也是应用发布的标准格式一个完整的 Docker 镜像可以支撑一个 Docker 容器的运行进入容器之后最常见的操作就是在容器中安装应用服务 Do…

Python绘图入门:使用Matplotlib绘制柱状图

Python绘图入门&#xff1a;使用Matplotlib绘制柱状图 柱状图是一种常见的数据可视化方式&#xff0c;能够直观地展示不同类别之间的数据差异。在Python中&#xff0c;Matplotlib是一个非常强大且灵活的绘图库&#xff0c;它不仅能绘制简单的图表&#xff0c;还能创建复杂的多…

importlib库介绍

importlib importlib 包的目的有两个。 一种是在 Python 源代码中提供 import 语句&#xff08;因此&#xff0c;通过扩展&#xff0c;import() 函数&#xff09;的实现。 这提供了 import 的实现&#xff0c;它可以移植到任何 Python 解释器。 这也提供了一种比 Python 以外…

【鸿蒙学习】使用HarmonyOS NEXT与Uniapp开发同一鸿蒙应用的区别及分析

随着鸿蒙操作系统的普及&#xff0c;开发者面临着多种开发工具的选择。本文将通过开发、部署、运行、使用四个方面&#xff0c;详细分析使用HarmonyOS NEXT与Uniapp开发同一鸿蒙应用的区别&#xff0c;为开发者提供参考。 一、引言 鸿蒙操作系统&#xff08;HarmonyOS&#xf…