LeetCode题练习与总结:删除链表中的节点--237

一、题目描述

有一个单链表的 head,我们想删除它其中的一个节点 node

给你一个需要删除的节点 node 。你将 无法访问 第一个节点  head

链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。

删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:

  • 给定节点的值不应该存在于链表中。
  • 链表中的节点数应该减少 1。
  • node 前面的所有值顺序相同。
  • node 后面的所有值顺序相同。

自定义测试:

  • 对于输入,你应该提供整个链表 head 和要给出的节点 nodenode 不应该是链表的最后一个节点,而应该是链表中的一个实际节点。
  • 我们将构建链表,并将节点传递给你的函数。
  • 输出将是调用你函数后的整个链表。

示例 1:

输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9

示例 2:

输入:head = [4,5,1,9], node = 1
输出:[4,5,9]
解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9

提示:

  • 链表中节点的数目范围是 [2, 1000]
  • -1000 <= Node.val <= 1000
  • 链表中每个节点的值都是 唯一 的
  • 需要删除的节点 node 是 链表中的节点 ,且 不是末尾节点

二、解题思路

由于我们无法访问链表的第一个节点,且只能访问需要删除的节点,我们不能直接删除该节点,因为这样会导致无法访问后续节点。但是,我们可以采取一种巧妙的方法:将需要删除的节点的下一个节点的值复制到需要删除的节点,然后删除下一个节点。

具体步骤如下:

  1. 将给定节点(node)的下一个节点(node.next)的值复制到给定节点。
  2. 将给定节点的 next 指针指向下一个节点的下一个节点(node.next.next)。
  3. 删除下一个节点(即原本需要删除的节点的下一个节点),这可以通过将给定节点的 next 指针指向下下个节点来实现。

三、具体代码

class Solution {public void deleteNode(ListNode node) {// 将下一个节点的值复制到当前节点node.val = node.next.val;// 删除下一个节点,即将当前节点的next指针指向下下个节点node.next = node.next.next;}
}

这样,我们就实现了删除链表中的指定节点,而无需访问链表的头节点。需要注意的是,题目已经保证了 node 不是链表的最后一个节点,因此 node.next 一定不为空,这样我们的操作才是安全的。

四、时间复杂度和空间复杂度

1. 时间复杂度

该算法包含的操作步骤如下:

  • 将下一个节点的值复制到当前节点:这是一个赋值操作,其时间复杂度为 O(1)。
  • 将当前节点的 next 指针指向下下个节点:这也是一个赋值操作,其时间复杂度为 O(1)。

这两个操作都是常数时间操作,并且没有循环或者递归调用,因此整个函数的时间复杂度为 O(1),即常数时间复杂度。

2. 空间复杂度

在执行删除操作的过程中,我们没有使用额外的数据结构来存储链表中的节点或者节点的值。我们仅仅是改变了节点的值和指针的指向,没有引入新的内存分配。

因此,算法的空间复杂度为 O(1),即常数空间复杂度。

该算法的时间复杂度和空间复杂度都非常低,这是因为算法直接在链表上操作,而不需要遍历整个链表,也不需要额外的存储空间。

五、总结知识点

  • 链表(Linked List)

    • 链表是一种常见的基础数据结构,由一系列节点(Node)组成。
    • 每个节点包含数据域(value)和指向下一个节点的指针(next)。
  • 节点(Node)

    • 在链表中,每个元素被封装为一个节点。
    • 节点通常包含两个部分:数据部分(本例中为 int val)和指针部分(本例中为 ListNode next)。
  • 指针(Pointer)

    • 在Java中,指针的概念通过引用(Reference)实现。
    • ListNode next 是一个指向下一个节点的引用。
  • 引用(Reference)

    • Java中的引用用于访问内存中的对象。
    • 在本例中,node.next 是一个引用,指向当前节点的下一个节点。
  • 赋值操作(Assignment)

    • node.val = node.next.val; 是一个赋值操作,将下一个节点的值复制到当前节点。
  • 链表操作

    • 链表操作通常涉及指针的更改,而不涉及数据本身的复制。
    • 在本例中,通过改变指针的指向来实现节点的“删除”。
  • 删除操作

    • 在本例中,删除操作实际上是通过改变指针来跳过要删除的节点,而不是从内存中删除节点。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

实例讲解电动汽车驱动扭矩控制策略及Simulink建模方法

电动汽车完成上电后进入Ready状态&#xff0c;此时车辆具备行车条件&#xff0c;处于行车准备状态。驾驶员挂挡&#xff08;D挡或R挡&#xff09;后&#xff0c;踩油门踏板即可控制车辆开始行车。对于电动汽车来说&#xff0c;驱动行车控制过程一般为&#xff0c;VCU接收Ready状…

高侧电流检测电路设计

1 简介 此单电源、高侧、低成本、电流检测解决方案可以检测 50mA 和 1A 之间的负载电流&#xff0c;并将其转换为 0.25V至 5V 的输出电压。高侧检测使系统能够识别接地短路&#xff0c;并且不会对负载造成接地干扰。 2 设计目标 2.1 输入 2.2 输出 ​​​ 2.3 电…

轴承介绍以及使用

轴承&#xff08;Bearing&#xff09;是在机械传动过程中起固定、旋转和减小载荷摩擦系数的部件。也可以说&#xff0c;当其它机件在轴上彼此产生相对运动时&#xff0c;用来降低运动力传递过程中的摩擦系数和保持转轴中心位置固定的机件。 轴承是当代机械设备中一种举足轻重的…

在java中怎么把对象转换成json,可以使用jackson

简述 在Spring Boot应用中&#xff0c;将Java对象转换为JSON字符串通常有两种主要方法&#xff1a;使用Jackson库或使用Gson库。由于Spring Boot默认集成了Jackson库&#xff0c;所以我们将重点介绍如何使用Jackson来进行对象到JSON的转换。 第1步&#xff1a;Maven添加依赖 …

STM32 Modbus主从站实例程序-FreeRTOS

资料下载地址&#xff1a;STM32 Modbus主从站实例程序-FreeRTOS​​​​​​​ 基本设置 启用Freertos,添加任务 设置中断优先级 设置长生成MDK工程 工程里面添加Modbus库 修改main.c 修改freertos.c 编译下载到单片机,完美运行

深入解析 helpTransfer 方法:多线程协作中的哈希表扩容

文章目录 什么是哈希表哈希表的问题&#xff1a;扩容扩容的挑战扩容的原理helpTransfer 方法检查是否正在扩容生成扩容标记并检查条件判断是否需要更多线程帮助加入搬家工作返回新表或旧表 什么是哈希表 哈希表&#xff08;HashMap&#xff09;是一种常用的数据结构&#xff0…

熬夜2月,终成人人可自建的AI网站

一、前言 自小码哥AI上线以来&#xff0c;备受粉丝们的关注&#xff0c;拖更了两个月&#xff0c;每日加班加点研发系统&#xff0c;2.0终于上线了。 作为一名年过三十的程序员&#xff0c;我深刻体会到了职场的残酷和不确定性&#xff0c;特别是这两年&#xff0c;经济不景气…

ROS理论与实践学习笔记——2 ROS通信机制之服务通信

服务通信也是ROS中一种极其常用的通信模式&#xff0c;服务通信是基于请求响应模式的&#xff0c;是一种应答机制。也即: 一个节点A向另一个节点B发送请求&#xff0c;B接收处理请求并产生响应结果返回给A&#xff0c;用于偶然的、对时时性有要求、有一定逻辑处理需求的数据传输…

基于Java语言的桩底层直连协议和云快充协议

‌云快充协议‌是一种标准通信协议&#xff0c;主要用于电动车与充电桩之间的数据交换。该协议包含了充电请求、状态查询、支付等多个功能模块&#xff0c;这些功能的实现不仅需要对协议进行深入理解&#xff0c;还需要编写相应的代码进行封装。云快充协议旨在解决市场上快充标…

【C++前缀和 状态压缩】1177. 构建回文串检测|1848

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 位运算、状态压缩、枚举子集汇总 LeetCode 1177. 构建回文串检测 难度分&#xff1a;1848 给你一个字符串 s&#xff0c;请你对 s 的子串进行检测。 每次检测&#x…

Python OpenCV精讲系列 - 基于深度学习的目标检测(十二)

&#x1f496;&#x1f496;⚡️⚡️专栏&#xff1a;Python OpenCV精讲⚡️⚡️&#x1f496;&#x1f496; 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计&#xff0c;从基础概念入手&#xff0c;逐步深入到图像处理、特征检测、物体识…

C++ | Leetcode C++题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countSegments(string s) {int segmentCount 0;for (int i 0; i < s.size(); i) {if ((i 0 || s[i - 1] ) && s[i] ! ) {segmentCount;}}return segmentCount;} };

await命令使用注意点

第一点&#xff0c;前面已经说过&#xff0c;await 命令后面的 Promise 对象&#xff0c;运行结果可能是 rejected&#xff0c;所以最好把 await 命令放在 try...catch 代码块中 第二点&#xff0c;多个 await 命令后面的异步操作&#xff0c;如果不存在继发关系&#xff0c;最…

最优化理论与自动驾驶(二-补充):求解算法(梯度下降法、牛顿法、高斯牛顿法以及LM法,C++代码)

在之前的章节里面&#xff08;最优化理论与自动驾驶&#xff08;二&#xff09;&#xff1a;求解算法&#xff09;我们展示了最优化理论的基础求解算法&#xff0c;包括高斯-牛顿法&#xff08;Gauss-Newton Method&#xff09;、梯度下降法&#xff08;Gradient Descent Metho…

FileLink跨网文件传输 | 跨越网络边界的利器,文件传输不再受限

在当今数字化时代&#xff0c;企业与个人对文件传输的需求不断增长&#xff0c;尤其是在跨网环境中。传统的文件传输方式常常受到网络带宽、传输速度和安全性的限制&#xff0c;给用户带来了诸多不便。FileLink 的出现&#xff0c;为这一难题提供了完美解决方案&#xff0c;让文…

Python 聊聊有内置函数,又该怎么学习内置函数

前言 python有内置函数的概念&#xff0c;从Python3.x开始&#xff0c;内置函数位于builtins模块&#xff0c;比如我们常用的内置函数len()&#xff0c;其实它是builtins模块下的属性&#xff0c;我们也可以builtins.len&#xff08;&#xff09;去访问&#xff0c;当然因为每个…

鼎曼白茶贡眉:贮留芳香记忆,书写老茶传奇

在茶的世界 每一叶都承载着岁月的印记 每一香都凝聚着时光的韵味 其中 有一种温润如玉、恬淡从容的存在 它便是2017年贡眉 这款经过七年时光沉淀与陈化的白茶 以其独特的韵味与品质 吸引了无数茶客的青睐 今日 让我们一同领略2017年贡眉的魅力 PART 01 FIRST OF ALL …

力扣【118-杨辉三角】【数组-C语言】

题目&#xff1a;力扣-118 杨辉三角&#xff1a;&#xff08;算法思路&#xff09; 1. 每行第一个数和最后一个数都是1 2. 把杨辉三角左端对齐&#xff0c;从第三行开始&#xff0c;非首尾的元素值等于上一行同列的元素与该元素之前的元素之和&#xff0c;即 t [ j ] r e t …

【自动化测试】Appium 生态工具以及Appium Desktop如何安装和使用

引言 Appium 是一个开源的自动化测试框架&#xff0c;用于测试原生、移动 Web 和混合应用程序。它支持 iOS、Android 和 Windows 平台。Appium 生态系统包含多个工具和库&#xff0c;这些工具和库可以与 Appium 一起使用&#xff0c;以提高移动应用的自动化测试效率 文章目录 引…

[翟旭发射器]python-推导式-列表list表达式练习

# 简单的列表生成 numbers00[x for x in range(1,11)] print(numbers00) # 带条件的列表生成 numbers01[x for x in range(1,11) if x%20] print(numbers01) # 带表达式的列表生成 numbers10[x**2 for x in range(1,11)] print(numbers10) # 嵌套循环的列表生成 coordinates[(x…