如何在O(1)时间删除链表指定节点(Java实现)

2023-10-31

声明:题目背景为剑指offer-13 在O(1)时间删除链表节点
给出一个链表如下:
这里写图片描述
删除链表中给定节点,我想最容易想到的方法就是循环遍历,假设想删除节点toBeDeleted,我们先遍历链表,找到节点的下一节点为toBeDeleted的节点,将其指向toBeDeleted节点的下一节点即可保证安全的删除链表且无断开。示意图如下:
这里写图片描述
但是这种方法的复杂度O(n),在O(1)时间删除指定节点,书中指出将下一个节点的内容复制到需要删除的节点上面覆盖原有内容,再删除下一个节点即相当于删除了原节点,如下图:
这里写图片描述
这里需要注意考虑以下几种情况:
1.链表和待删除节点均不为空
2.链表中只有一个节点时
3.待删除节点为尾节点时
4.链表中多个点,待删除节点不为尾节点
帅气的方法,所以自己也用Java实现了一下。方法实现代码如下:

/**
 * 在O(1)时间内删除指定节点,思路:找到指定节点的下一节点,覆盖指定节点
     * 考虑:1.链表和待删除节点均不为空
     *      2.链表中只有一个节点时-->头结点等于尾节点
     *      3.待删除节点为尾节点时-->待删除节点不存在下一个节点-->
     *        只有循环遍历
     *      4.链表中多个点,待删除节点不为尾节点
     * @param listNode
     * @param toBeDeleted
     */
    public void deleteNode(ListNode listNode, ListNode toBeDeleted){
        //输入的链表及待删节点不能为空
        if(listNode == null || toBeDeleted == null) return;

        if(listNode == toBeDeleted){
            listNode = null;
        }else if(toBeDeleted.next != null){
            ListNode nextNode =  toBeDeleted.next;
            toBeDeleted.val = nextNode.val;
            toBeDeleted.next = nextNode.next;
        }else{
            while(listNode.next != toBeDeleted){
                listNode = listNode.next;
            }
            listNode.next = null;
        }

    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在O(1)时间删除链表指定节点(Java实现) 的相关文章

  • LaTex 使用特殊章节符号 (§)

    参考 LaTex 使用特殊章节符号 LaTex 使用特殊章节符号 在 tex文件开头 加上以下内容 usepackage utf8 inputenc usepackage cleveref crefname section Crefname
  • Android动画进阶指北

    原文链接 Android Animation Advanced Tricks 前面的文章介绍了动画的基本使用方法 本文来聊一聊涉及到动画的高级技巧 以及一些非常优质的学习资源和动画三方库和框架 页面之间的过渡动画 常规的动画都是针对某一页面
  • java配置文件中数据库密码加密

    最近 有位读者私信我说 他们公司的项目中配置的数据库密码没有加密 编译打包后的项目被人反编译了 从项目中成功获取到数据库的账号和密码 进一步登录数据库获取了相关的数据 并对数据库进行了破坏 虽然这次事故影响的范围不大 但是这足以说明很多公司
  • VScode使用pip已经下载了faker,但还是报错ModuleNotFoundError: No module named ‘faker‘

    修复一下pip python m ensurepip pip install faker 但是在安装faker的时候 出现了这样的情况 提示warning 换一种写法 pip install faker i http pypi douban
  • 给定一个介于0和1之间的实数,类型为double,打印它的二进制表示

    给定一个介于0和1之间的实数 0 625 类型为double 打印它的二进制表示 如果该数字无法精准地用32位以内的二进制表示 则打印 ERROR 先上代码 public class printbinary public static vo

随机推荐

  • ABAP DOI 技术

    用户提出的报表 是用EXCLE显示的 有许多特殊格式 比如 加粗 大小字体等 普通的ALV报表输出并不能满足用户的要求 那么只能用ALV与EXCLE的集成技术 目前已知的技术有两种 一种是OLE技术 用SMW0上传模板 然后填写数据 多数用
  • Springboot的pom.xml需要用到的依赖总结:

  • 蜣螂优化(DBO)算法(含MATLAB代码)

    先做一个声明 文章是由我的个人公众号中的推送直接复制粘贴而来 因此对智能优化算法感兴趣的朋友 可关注我的个人公众号 启发式算法讨论 我会不定期在公众号里分享不同的智能优化算法 经典的 或者是近几年提出的新型智能优化算法 并附MATLAB代码
  • python怎么生成词云图

    词云图是什么 词云图又称文字云 是信息可视化的表现形式之一 词云是把文本中出现频率较高的关键词进行视觉上的突出显示 形成关键词云层或关键词渲染 从而过滤掉大量的文本信息 读者可以快速领略文本的主旨 相对柱状图 折线图 饼图等用来显示数据的图
  • log4j2 JNDI注入漏洞问题复现

    最近大家应该都有被log4j2的JNDI注入漏洞搞的心烦意乱 当程序将用户输入的数据进行日志输出时 即可触发此漏洞 成功利用此漏洞可以在目标服务器上执行任意代码 以下为改问题的复现方法 1 首先下载JNDI Injection 起 RMI
  • 在docker里使用jupyterhub

    准备工作 需要先安装docker 具体方法参考我的上一篇文章 1 查看本地镜像docker images D go 练习 go zero demo gt docker images REPOSITORY TAG IMAGE ID CREAT
  • 程序切片知识点整理(程序依赖图、静态切片、动态切片)

    整理了很久很久的一篇文章 觉得有收获的可以点个赞点个关注哇 有问题也可以评论或找我交流 有评论必回复 目录 一 基础知识概念 关于控制流信息有如下几个基本概念 1 基本块 2 控制流图 cfg 3 有向图G 基于数据流分析的一些定义 1 到
  • SPDK/NVMe存储技术分析之SSD设备的发现(一)

    源代码及NVMe协议版本 SPDK spdk 17 07 1 DPDK dpdk 17 08 NVMe Spec 1 2 1 1 识别NVMe固态硬盘的方法 NVMe SSD是一个PCIe设备 那么怎么识别这种类型的设备 有两种方法 方法1
  • 工厂模式(分简单工厂模式、工厂方法模式、抽象工厂模式)

    1 工厂模式概述 1 1 简单工厂模式 简单工厂模式是一种创建型设计模式 它实现了创建对象的功能 但不使用任何具体类的名称 客户端通过调用工厂类的静态方法来创建一个具体的对象 无需关心对象创建的细节 1 2 工厂方法模式 工厂方法模式是一种
  • STM32 的定时器解析

    STM32有3种类型的定时器 分别是基本定时器 通用定时器和高级定时器 基本定时器有TIM6和TIM7 通用定时器有TIM2 TIM3 TIM4和TIM5 高级定时器有TIM1和TIM8 根据芯片的型号不同定时器的个数也会有所区别 本文主要
  • 《第四部分:测试用例--等价类、边界值与用例编写》

    目录 关联实例练习文档 一 认识基本术语 一 术语一 二 术语二 三 术语三 控制流图的概念 四 圈复杂度计算公式 二 用例设计 一 等价类 1 1 等价类介绍 1 2 等价类划分举例 1 3 等价类划分的设计用例思路 1 4 小结 等价类
  • JavaScript复选框的使用

    div p 请选择你的爱好 p div
  • 十行代码搞定目标检测

    大数据文摘出品 编译 邢畅 宁静 计算机视觉是人工智能的一个重要领域 是关于计算机和软件系统的科学 可以对图像和场景进行识别 理解 计算机视觉还包括图像识别 目标检测 图像生成 图像超分辨率重建等多个领域 由于存在大量的实际需求 目标检测可
  • 小技巧(5):将TT100K数据集转成VOC格式,并且用Python脚本选出45类超过100张的图片和XML

    上一篇 小技巧 4 将txt中的某两列数据写入csv文件中 制作图像分类标签 文章目录 一 相关准备 1 1 下载数据集 1 2 下载代码文件 1 3 将相关文件移入代码文件 二 创建标准的VOC文件夹 三 生成整个数据集的XML文件 四
  • leetcode-第247场周赛-5798循环轮转矩阵(模拟题)

    5798 循环轮转矩阵 模拟题 题目链接 https leetcode cn com problems cyclically rotating a grid 题目 给你一个大小为 m x n 的整数矩阵 grid 其中 m 和 n 都是 偶
  • Code=201 “Siri and Dictation are disabled“

    iOS 15 之前的语音识别是使用SpeechKit和AVFoundation两个框架来配合使用 其中主要的类有SFSpeechRecognizer SFSpeechAudioBufferRecognitionRequest SFSpeec
  • SSHLibrary本地远程访问LINUX遇Incompatible ssh peer错误

    FAIL SSHException Incompatible ssh peer no acceptable kex algorithm 使用python写了段脚本 远程访问LINUX主机 同样的一段脚本 访问主机A可以 访问主机B就报标题中
  • QtModbus Serial 简单示例

    来自QQ群 Linux 技术分享 311078264 打开链接加入QQ群 https jq qq com wv 1027 k 5Gr3bAx 此文档由elikang整理 为了文章简单直接 许多细节未能在文章中体现 如有疑问请进群讨论 Qt
  • 浮动图标代码

    lt html xmlns http www w3 org 1999 xhtml gt lt head gt lt title gt wahaha lt meta
  • 如何在O(1)时间删除链表指定节点(Java实现)

    声明 题目背景为剑指offer 13 在O 1 时间删除链表节点 给出一个链表如下 删除链表中给定节点 我想最容易想到的方法就是循环遍历 假设想删除节点toBeDeleted 我们先遍历链表 找到节点的下一节点为toBeDeleted的节点