算法的学习笔记—在 O(1) 时间内删除链表节点

news2024/11/15 21:29:22

img

😀前言
在链表操作中,删除节点是一个常见的操作。然而,如何在最短的时间内完成删除节点的操作是一个值得探讨的问题。通常情况下,删除链表节点需要遍历链表来找到目标节点及其前驱节点,时间复杂度为 O(N)。但是,通过巧妙的设计,可以在 O(1) 的时间内完成删除操作。本文将详细介绍这一算法及其实现。

🏠个人主页:尘觉主页

文章目录

  • 😆在 O(1) 时间内删除链表节点
    • 😋解题思路
      • 🤔情况 1:删除的节点不是尾节点
      • 🤔情况 2:删除的节点是尾节点
      • 😃Java 实现
      • 🥰代码解析
      • 😊示例分析
    • 😄总结

😆在 O(1) 时间内删除链表节点

😋解题思路

我们可以将删除节点的操作分为两种情况来处理:

🤔情况 1:删除的节点不是尾节点

如果要删除的节点不是链表的尾节点,那么我们可以通过以下步骤来实现删除:

  1. 将下一个节点的值赋给当前节点:例如,我们要删除节点 A,可以将 A 的下一个节点 B 的值复制到 A。
  2. 调整指针:令 A 指向 B 的下一个节点,从而跳过节点 B。
  3. 删除节点 B:这样,节点 A 依然存在于链表中,但它的值和位置实际上已经是原节点 B 的值和位置,节点 B 被删除了。

这一过程无需遍历链表,时间复杂度为 O(1)。

1176f9e1-3442-4808-a47a-76fbaea1b806

🤔情况 2:删除的节点是尾节点

如果要删除的节点是链表的尾节点,处理就会稍微复杂一些:

  1. 遍历链表:找到要删除节点的前一个节点。
  2. 调整指针:将前一个节点的 next 指针置为 null,从而删除尾节点。

由于需要遍历整个链表来找到前驱节点,因此时间复杂度为 O(N)。

4bf8d0ba-36f0-459e-83a0-f15278a5a157

综上,如果进行 N 次操作,那么大约需要操作节点的次数为 N-1+N=2N-1,其中 N-1 表示 N-1 个不是尾节点的每个节点以 O(1) 的时间复杂度操作节点的总次数,N 表示 1 个尾节点以 O(N) 的时间复杂度操作节点的总次数。(2N-1)/N ~ 2,因此该算法的平均时间复杂度为 O(1)。

😃Java 实现

以下是上述思路的 Java 实现:

public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
    if (head == null || tobeDelete == null)
        return null;
    if (tobeDelete.next != null) {
        // 要删除的节点不是尾节点
        ListNode next = tobeDelete.next;
        tobeDelete.val = next.val;
        tobeDelete.next = next.next;
    } else {
        if (head == tobeDelete)
             // 只有一个节点
            head = null;
        else {
            ListNode cur = head;
            while (cur.next != tobeDelete)
                cur = cur.next;
            cur.next = null;
        }
    }
    return head;
}

🥰代码解析

  1. 入口方法 deleteNode
    • 处理特殊情况:首先检查输入的链表头节点和要删除的节点是否为 null,若是则直接返回 null
    • 如果要删除的节点不是尾节点,直接将下一个节点的值复制到当前节点,调整当前节点的 next 指针,跳过下一个节点。
    • 如果要删除的节点是尾节点,则需要遍历链表找到前驱节点,并将前驱节点的 next 指针置为 null
  2. 处理尾节点
    • 如果链表只有一个节点,直接将链表头设为 null
    • 如果链表有多个节点,则遍历链表找到尾节点的前驱节点,并调整指针。

😊示例分析

假设链表为 1 -> 2 -> 3 -> 4 -> 5,我们要删除节点 3。根据上面的算法,节点 3 将被节点 4 的值覆盖,链表变为 1 -> 2 -> 4 -> 4 -> 5。随后,节点 4 的 next 指向节点 5,最终链表变为 1 -> 2 -> 4 -> 5,实现了删除节点 3 的效果。

😄总结

本文介绍了一种在 O(1) 时间内删除链表节点的算法,通过区分要删除的节点是否为尾节点来进行不同的处理。对于非尾节点,可以通过复制和指针调整在常数时间内完成删除操作;对于尾节点,则需要遍历链表找到前驱节点,时间复杂度为 O(N)。整体来看,该算法的平均时间复杂度为 O(1),是处理链表删除问题的高效方法。

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

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

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

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

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

img

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

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

相关文章

【Pyspark-驯化】一文搞懂Pyspark中对json数据处理使用技巧:get_json_object

【Pyspark-驯化】一文搞懂Pyspark中对json数据处理使用技巧:get_json_object 本次修炼方法请往下查看 🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地! 🎇 …

stm32入门学习13-时钟RTC

(一)时钟RTC stm32内部集成了一个秒计数器RTC,用于显示我们日常的时间,如日期年月日,时分秒等,RTC的主要原理就是进行每秒自增,如果我们知道开始记秒的开始时间,就可以计算现在的日…

Redis操作--RedisTemplate(二)StringRedisTemplate

一、介绍 1、简介 由于存储在 Redis 中的 key 和 value 通常是很常见的 String 类型,Redis模块提供了 RedisConnection 和 RedisTemplate 的扩展,分是 StringRedisConnection 和 StringRedisTemplate,作为字符串操作的解决方案。 通过源码…

JVM二:JVM类加载机制

目录 前言 1.什么是类加载? 2.类加载整体流程 3.一个类什么时候被加载? 4.双亲委派模型 4.1 JVM默认提供了三个类加载器 4.1.1 BootstrapClassLoader 4.1.2 ExtensionClassLoader 4.1.3 ApplicationClassLoader 4.2 破坏双亲委派模型 前言 在上一篇文章中&#xf…

江科大/江协科技 STM32学习笔记P21

文章目录 ADC模数转换器ADC简介逐次逼近型ADCSTM32的ADCADC基本结构输入通道转换模式单次转换,非扫描模式连续转换,非扫描模式单次转换,扫描模式连续转换,扫描模式 触发控制数据对齐转换时间校准硬件电路电位器产生可调电压的电路…

Python图像背景去除

目录 🎁库的导入 🎀库的安装 🎁rembg库去除背景 🎁效果 🎁文末彩蛋 今天来介绍一个特别有趣的python库,rembg库,全称是“Remove Background”的缩写,意为“去除背景”&#xff…

边缘计算与物联网实训室解决方案

一、引言 随着物联网(IoT)技术的迅猛发展,数据量呈爆炸性增长,对数据处理和实时响应能力提出了更高要求。传统的云计算模式由于数据传输延迟和带宽占用等问题,难以满足物联网场景中对低延迟和高可靠性的需求。边缘计算…

QT判断操作系统类型和CPU架构

一、判断操作系统类型 1.在.pro文件中判断 macx { # mac only } unix:!macx{ # linux only } win32 { # windows only }2.在代码中判断 可以包含QGlobal头文件&#xff0c;判断预定义宏 #include <QtGlobal> ... #ifdef Q_OS_MAC // mac #endif#ifdef Q_OS_LINUX // …

Datawhale X 魔搭 AI夏令营 Task1 从零入门AI生图原理实践笔记

赛题内容 参赛者需在可图Kolors模型的基础上训练LoRA模型&#xff0c;生成无限风格&#xff0c;如水墨画风格、水彩风格、赛博朋克风格、日漫风格… 基于LoRA模型生成8张图片组成连贯故事&#xff0c;故事内容可自定义&#xff1b;基于8图故事&#xff0c;评估LoRA风格的美感度…

企业大模型落地从0到0.1

现在人工智能里的“大明星”——大模型&#xff0c;正在悄悄改变各行各业。这就像给企业装上了一颗聪明的大脑&#xff0c;能帮助解决各种棘手问题&#xff0c;提升工作效率。今天&#xff0c;我们就来分析下企业如何一步一步让这个“大脑”在自家地盘里真正派上用场&#xff0…

LVS 实现四层负载均衡项目实战--DR模式

一、环境准备 主机名IP地址router eth0&#xff1a;172.25.254.100 eth1&#xff1a;192.168.0.100 clienteth0&#xff1a;172.25.254.200lvseth1&#xff1a;192.168.0.50web1web2 1、client配置 [rootclient ~]# cat /etc/NetworkManager/system-connections/eth0.nmconne…

ArrayList 动态扩容

目录 一、 构造函数1、有参构造函数2、无参构造函数 二、数组扩容三、总结 一、 构造函数 1、有参构造函数 1.1如果指定了容量大小&#xff0c;创建该大小的数组 1.2如果没有指定大小&#xff0c;默认创建空数组 1.3如果是指定小于0的大小&#xff0c;抛出异常 2、无参构造…

前端工程化15-邂逅ES6的语法规范

4、ES6邂逅 3.1、什么是ECMA ECMA&#xff08;European Computer Manufacturers Association&#xff09;中文名为欧洲计算机制造商协会&#xff0c;这个组织的目标是评估、开发和认可电信和计算机标准。1 994年后该组织改名为Ecma国际。 3.2、什么是ECMAScript ECMAScript…

怎样找回U盘里误删的文件?试试这些方法!

在日常工作和生活中&#xff0c;我们经常会使用U盘来存储和传输重要的文件。然而&#xff0c;由于操作失误或其他原因&#xff0c;我们有时会误删U盘中的文件。当遇到这种情况时&#xff0c;很多人可能会感到焦虑和无助。不过&#xff0c;幸运的是&#xff0c;有几种方法可以帮…

三十六、【人工智能】【机器学习】【监督学习】- Bagging算法模型

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

【清空大脑】

清空大脑&#xff0c;就是把大脑里的想法&#xff0c;都写下来&#xff0c;放到一个地方。这样&#xff0c;可以降低大脑的压力。 我记得我第一次清空大脑的时候&#xff0c;使用的事微软OutLook的便签功能&#xff0c;一共记录了200多项。 看着这200多项&#xff0c;我感觉自…

ubuntu设置开机自动执行脚本、ubuntu设置开机自动启动java服务

使用 crontab 编辑器添加一个任务&#xff0c;该任务将在系统启动时执行你的脚本。在终端中运行以下命令&#xff1a; crontab -e添加开机自启任务&#xff1a; 在打开的编辑器中&#xff0c;添加以下行&#xff1a; reboot /home/demo.jar &这行代码告诉 cron 在每次系统…

微调神器LLaMA-Factory官方保姆级教程来了,从环境搭建到模型训练评估全覆盖

1. 项目背景 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xff08;pt&#xff09;&…

探索AI角色扮演的新前端工具:SillyTavern

在人工智能&#xff08;AI&#xff09;领域&#xff0c;角色扮演&#xff08;Roleplay&#xff09;无疑是一个富有趣味且充满潜力的应用场景。无论你是AI爱好者还是开发者&#xff0c;找到一个合适的前端工具来访问并与语言模型进行互动是至关重要的。今天&#xff0c;我们将介…

[2024_08_12日志]ONNX Runtime的使用

问题&#xff1a;Segmentation 错误。在 C API 上使用自定义 onnx 模型运行。模型在 Python 上按预期工作&#xff0c;但在 C API 上运行相同的模型时&#xff0c;会收到一个分段错误 python的模型代码如下&#xff1a; class Facenet(nn.Module):def __init__(self, backbone…