LeetCode【0019】删除链表的倒数第N个结点

news/2024/11/13 16:14:16/

本文目录

  • 1 中文题目
  • 2 求解方法:虚拟头节点和快慢指针
    • 2.1 方法思路
    • 2.2 Python代码
    • 2.3 复杂度分析
  • 3 题目总结

1 中文题目

给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例:
在这里插入图片描述

链表如上:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]

提示:

  • 链表中结点的数目为 sz
  • 1 ≤ s z ≤ 30 1 \leq sz \leq 30 1sz30
  • 0 ≤ N o d e . v a l ≤ 100 0 \leq Node.val \leq 100 0Node.val100
  • 1 ≤ n ≤ s z 1 \leq n \leq sz 1nsz

2 求解方法:虚拟头节点和快慢指针

2.1 方法思路

方法核心

使用虚拟头节点统一操作逻辑,采用快慢指针确定删除位置,快指针先走n步,然后快慢指针同步移动,直到快指针到达末尾

实现步骤

  • 创建虚拟头节点阶段
    • 新建值为0的虚拟节点
    • 将虚拟节点指向原链表头部
  • 初始化快慢指针阶段
    • 快慢指针都指向虚拟头节点
    • 确保初始状态一致
  • 快指针移动阶段
    • 快指针向前移动n步
    • 建立n个节点的间隔
  • 双指针同步移动阶段
    • 快慢指针同时向前移动
    • 直到快指针到达链表末尾
  • 删除目标节点阶段
    • 慢指针此时位于待删除节点的前一个位置
    • 修改next指针完成删除操作

方法示例

python">输入:head = [1,2,3,4,5], n = 2
# 1. 初始状态:创建虚拟头节点,快慢指针都指向虚拟头节点
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
↑
fast
↑
slow
(dummy)# 2. 快指针先移动n=2步
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL
↑         ↑
slow      fast
(dummy)# 3. 快慢指针同时移动,直到快指针的next为NULL
# 移动过程中的状态:
# 第一步:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL↑         ↑slow      fast# 第二步:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL↑         ↑slow      fast# 第三步:
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL↑         ↑slow      fast# 4. 此时slow指向待删除节点(4)的前一个节点(3)
# 执行删除操作:slow.next = slow.next.next
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL↑         ↑slow      fast变为:
0 -> 1 -> 2 -> 3 -----5 -> NULL↑        ↑slow     fast# 5. 最后返回dummy.next,即返回真实的头节点
1 -> 2 -> 3 -> 5 -> NULL

2.2 Python代码

python">class Solution:def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:# 创建虚拟头节点,统一处理逻辑,避免分类讨论dummy = ListNode(0)dummy.next = head# 初始化快慢指针,都指向虚拟头节点fast = slow = dummy# 第一步:快指针先走n步# 这样后面快指针到末尾时,慢指针正好在待删除节点的前一个位置for i in range(n):fast = fast.next# 第二步:快慢指针同时移动# fast.next 判断确保fast最后指向最后一个节点while fast.next:fast = fast.nextslow = slow.next# 第三步:删除倒数第n个节点# slow指向待删除节点的前一个节点slow.next = slow.next.next# 返回真实头节点return dummy.next

2.3 复杂度分析

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N链表长度
    • 快指针先走 n n n步: O ( n ) O(n) O(n)
    • 快慢指针同步走到末尾: O ( N − n ) O(N-n) O(Nn)
  • 空间复杂度: O ( 1 ) O(1) O(1)
    • 只使用了虚拟头节点: O ( 1 ) O(1) O(1)
    • 快慢指针: O ( 1 ) O(1) O(1)

3 题目总结

题目难度:中等
数据结构:链表
应用算法快慢双指针


http://www.ppmy.cn/news/1546718.html

相关文章

Oracle OCP认证考试考点详解082系列16

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 76. 第76题: 题目 解析及答案: 以下哪三项活动会被记录在数据库的警报日志中? A. 块损坏错误 数据库…

Conpair: 配对样本一致性concordance与污染contamination分析

Conpair 于2016年被发表在《Bioinformatics》上,用于分析配对样本(如某个病人的肿瘤样本和正常样本)WGS或WES测序的一致性和交叉个体污染。 特点 支持的基因组 因为需要指定markers选项,作者只提供了GRCh37, GRCh38, GRCm38的文…

Science Robotics 综述揭示演化研究新范式,从机器人复活远古生物!

在地球46亿年的漫长历史长河中,生命的演化过程充满着未解之谜。如何从零散的化石证据中还原古生物的真实面貌?如何理解关键演化节点的具体过程?10月23日,Science Robotics发表重磅综述,首次系统性提出"古生物启发…

【分布式】CAP理论

CAP定理的核心要点: CAP定理指出,任何一个分布式系统在面对网络分区(Partition)的情况下,最多只能同时满足以下三个特性中的两个: 一致性(Consistency): 所有节点在同一…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中,我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

新日撸java三百行` 新手小白java学习记录 `Day1

新日撸java三百行新手小白java学习记录 Day1 模拟多线程回调机制 文章目录 新日撸java三百行 新手小白java学习记录 前言一 、模拟异步机制提出问题解决方案 前言 古人称长江为江,黄河为河。长江水清,黄河水浊,长江在流,黄河也在…

cesium 3DTiles之pnts格式详解

Point Cloud 1 概述 点云(Point Cloud)瓦片格式用于高效流式传输大规模点云数据,常用于 3D 可视化中。每个点由位置(Position)和可选的属性定义,这些属性用来描述点的外观(如颜色、法线等&…

Spring Cloud微服务超详细讲解

Spring Cloud 是一个基于 Spring Boot 的微服务框架,它提供了一系列工具和服务来帮助开发者构建和管理微服务架构。以下是一个超级详细的讲解,涵盖了 Spring Cloud 的核心概念、组件以及如何构建一个简单的微服务应用。 1. 微服务架构概述 什么是微服务…