Leetcode 删除链表倒数第 N 个节点

news2024/11/27 12:01:41

算法思想:

使用了双指针法。下面是详细的算法思想:

1. 引入虚拟头节点(dummy node)

  • 为了处理链表的一些边界情况(比如删除头节点),我们在链表的头部引入了一个虚拟节点 dummy,并让它指向原来的头节点 head。这样,无论我们要删除哪个节点,处理过程都变得更加统一和简单。

2. 定义两个指针:快指针(fast)和慢指针(slow)

  • 我们使用两个指针,fastslow,最初都指向虚拟头节点 dummy
  • 快指针 fast 会比慢指针 slow 超前移动 n+1 步。这样,当 fast 指向链表末尾(null)时,slow 刚好指向要删除节点的前一个节点。

3. 移动快指针

  • 首先,快指针 fast 先向前移动 n+1 步,这样可以确保快指针和慢指针之间相隔 n 个节点。

4. 同时移动快慢指针

  • 接下来,快慢指针一起向前移动,直到快指针到达链表的末尾。这时,慢指针 slow 就刚好处于要删除节点的前一个位置。

5. 删除节点

  • 现在,慢指针 slow 的下一个节点就是我们需要删除的节点。通过 slow.next = slow.next.next,我们跳过了这个节点,达到了删除的目的。

6. 返回新的头节点

  • 最后,返回 dummy.next。注意,链表的头节点可能发生了变化(如果原来的头节点被删除),因此我们返回虚拟节点 dummy 的下一个节点作为新的链表头节点。

代码核心思路总结:

  • 通过快慢指针法,仅需遍历链表一次(一次循环)就可以找到倒数第N个节点,并将其删除,时间复杂度为 O(L),其中 L 是链表的长度。空间复杂度为 O(1),因为只用了常数级别的额外空间。

示例分析:

假设输入链表为 [1, 2, 3, 4, 5]n = 2,即删除倒数第二个节点。

  1. 初始化fastslow 都指向虚拟节点 dummy
  2. 快指针前移fast 先向前移动 n+1 = 3 步,指向节点 3
  3. 同步移动:同时移动 fastslow,直到 fast 指向 null,此时 slow 指向节点 3 的前一个节点,即节点 2
  4. 删除节点:通过 slow.next = slow.next.next 删除节点 4,最终链表变为 [1, 2, 3, 5]

这样就成功地删除了倒数第2个节点。

在这里插入图片描述
java 实现代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        ListNode dummyNode = new ListNode(0);
        dummyNode.next = head;

        ListNode slow = dummyNode; //dummyNode,slow,fast都是引用类型
        ListNode fast = dummyNode;

        for(int i = 0; i <= n; i++) { //快指针先移动 n+1 步
            fast = fast.next;
        }

        while(fast != null) { //然后快慢指针一起移动
            slow = slow.next;
            fast = fast.next;
        }
        
        slow.next = slow.next.next;
        return dummyNode.next;
    }
}

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

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

相关文章

点评项目-5-商户查询缓存,从 2s 优化到 12ms

业务需求&#xff1a;当前端发送 shop/id 的请求时&#xff0c;我们需要向前端响应对应 id 的详细数据给前端 直接查询 mysql 效率比较低&#xff0c;我们可以使用 redis 作为中间件进行数据的缓存&#xff0c;先查询 redis &#xff0c;若redis 中未查询到&#xff0c;则在 m…

24.3 基于文件的服务发现模式

本节重点介绍 : 基于文件的服务发现提供了一种配置静态目标的更通用的方法可以摆脱对特定服务发现源的依赖通常的做法是调用内部CMDB的接口获取target数据&#xff0c;打上标签&#xff0c;生成json文件发给prometheus采集 基于文件的服务发现模式 解决的问题 之前手动配置…

视频声音怎么去除?高效的视频声音去除方法

视频声音怎么去除&#xff1f;在多媒体创作与编辑的过程中&#xff0c;我们时常会遇到这样一个需求&#xff1a;为了使用视频素材&#xff0c;需要去除视频里的声音。这一步骤看似简单&#xff0c;实则对于提升作品的整体质量和专业度至关重要。很多时候&#xff0c;我们收集到…

人工智能风险预警以及区块链解决方案探索

​​发表时间&#xff1a;2024年9月26日 一个专家小组在为世界经济论坛撰写的报告中警示道&#xff0c;人工智能&#xff08;以下均简称为AI&#xff09;技术增加了各类组织遭受攻击的风险&#xff0c;并带来了训练数据污染和提示词注入攻击等新威胁。由于训练和测试数据库的庞…

VmWare中安装CenterOs(内网服务器)

VmWare中安装CenterOs(内网服务器) 文章目录 VmWare中安装CenterOs(内网服务器)[toc] 一 、CentOS 7的下载与安装1、下载2、安装&#xff08;1&#xff09;前期准备&#xff08;2&#xff09;正式安装 开始等待&#xff01;&#xff01;&#xff01; 二、软件仓库更换1、root用…

openmmlab实现图像超分辨率重构

文章目录 前言一、图像超分辨率重构简介二、mmmagic实现图像超分 前言 超分辨率重构技术&#xff0c;作为计算机视觉领域的一项重要研究课题&#xff0c;近年来受到了广泛关注。随着科技的飞速发展&#xff0c;人们对图像质量的要求越来越高&#xff0c;尤其是在智能手机、监控…

使用idea和vecode创建vue项目并启动(超详细)

一、idea创建vue项目 创建项目之前先下载好插件 新建项目找到vue生成器 写好名称&#xff0c;找到自己需要存放的地址&#xff0c;node解释器安装方式可以看我上一个博客&#xff0c;vueCLI是选择vue的版本&#xff0c;我们可以使用idea自带的vue版本默认是vue3&#xff0c;创…

【LeetCode】修炼之路-0004-Median of Two Sorted Arrays【python】

题目 Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. The overall run time complexity should be O(log (mn)). Example 1: Input: nums1 [1,3], nums2 [2] Output: 2.00000 Explanation: merged…

java.lang.NoClassDefFoundError: kotlin/Result解决方案

问题 在控制窗口上虽然报错是找不到对应的class&#xff0c;但是呢在我们导入kotlin的后&#xff0c;还是报相同的异常&#xff0c;在网上查找了各种资料&#xff0c;都没有解决方案。 问题分析 在idea2021之后&#xff0c;kotlin都使用远程仓库&#xff08;kotlinx-coeouti…

选择 PDF 编辑器时要考虑什么?如何选择适用于 Windows 10 的 PDF 编辑器

选择 PDF 编辑器时要考虑什么&#xff1f; 随着技术的出现&#xff0c;您在网上浏览时肯定会遇到一些 PDF 软件。但是&#xff0c;选择PDF 编辑器时需要考虑什么&#xff1f;如果您是重度用户并将在您的工作场所使用它&#xff0c;建议您找到专业、使用方便且能够帮助您完成任…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件&#xff0c;包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件&#xff08;.py&#xff09;在执行时会被编译为字节码&#xff0c;并存储在 __pycache__ 目录下&#xff0c;文件名通…

Linux下编译Eclipse Paho库采用MQTT协议连接MQTT服务器

一、Eclipse Paho介绍 Eclipse Paho 是一个开源项目&#xff0c;由 Eclipse Foundation 主持&#xff0c;提供可靠的开源实现来处理 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议以及其他与物联网 (IoT) 相关的协议。MQTT 是一种轻量级的发布/订阅消…

SQL进阶技巧:Order by 中 NULLS LAST特性使用?

目录 1 需求描述 2 数据准备 3 问题分析 4 小结 如果觉得本文对你有帮助&#xff0c;想进一步学习SQL语言这门艺术的&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价59…

k8s的安装和部署

配置三台主机&#xff0c;分别禁用各个主机上的swap&#xff0c;并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…

k8s、prometheus、grafana数据采集和展示的链路流程

k8s集群中&#xff0c;容器级别的数据采集是由cAdvisor程序实现 cAdvisor # Container Advisor 容器顾问 cAdvisor程序是kubelet组件的一部分。 每个节点&#xff0c;包括master节点&#xff0c;都有一个kubelet系统服务&#xff0c; kukelet负责管理pod和容…

PCB在导出gerber文件时过孔盖油设置方法

目前主要使用两个电路设计软件&#xff0c;一个是Altium Designer 15.0版本&#xff0c;一个是cadence17.2版本。在设计完PCB以后需要导出加工文件发给PCB加工厂进行制板打样&#xff0c;其中需要注意的一点是过孔盖油设置。有的制板厂在提交工艺要求时写上过孔盖油即可&#x…

学习Ultralytics(data)(1)

今天我们来学习一下data文件夹下面的代码 首先有个_init_文件&#xff0c;典型的 Python 包中的 __init__.py 文件&#xff0c;用于导出 Ultralytics YOLO 项目中的一些重要类和函数。它将 base.py, build.py, 和 dataset.py 文件中的内容导入并暴露给外部使用。 看看里面有什…

息肉检测数据集 yolov5 yolov8适用于目标检测训练已经调整为yolo格式可直接训练yolo网络

息肉检测数据集 yolov5 yolov8 适用于目标检测训练 已经调整为yolo格式 可直接训练yolo网络 息肉检测数据集介绍 数据集概述 名称&#xff1a;息肉检测数据集&#xff08;基于某公开的分割数据集调整&#xff09;用途&#xff1a;适用于目标检测任务&#xff0c;特别是内窥镜…

【C/C++】错题记录(七)

题目一 题目二 C在调用函数时&#xff0c;当实参和形参的数据类型不一致时&#xff0c;会发生数据类型转换&#xff01;将低精度转换为高精度时&#xff0c;由编译器隐式完成&#xff1b;将高精度转换为低精度时&#xff0c;必须用强制类型转换运算符&#xff1b; static_cast…

Redis-缓存过期淘汰策略

缓存淘汰策略 生产上redis内存设置为多少 设置为最大内存的 3/4 redis 会占用物理机多少内存 默认大小是 0&#xff0c;64 位系统下表示不限制内存大小&#xff0c;32位系统表示 3G 如何设置修改redis内存大小 config get maxmemory 查看修改方式 配置文件 单位是字节 2.…