python-leetcode-删除链表的倒数第 N 个结点

LCR 021. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

可以使用双指针方法来解决这个问题,这样可以在一次遍历内完成删除操作,从而达到 O(n) 的时间复杂度。以下是 Python 代码实现:

解题思路:

  1. 初始化快慢指针:使用两个指针 fastslow,都指向头结点。
  2. 快指针先走 n 步:这样当快指针到达链表末尾时,慢指针正好指向倒数第 n 个节点的前一个节点。
  3. 同时移动快慢指针:直到快指针到达链表的末尾。
  4. 删除目标节点:调整前一个节点的 next 指针。

Python 代码:

class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextdef removeNthFromEnd(head: ListNode, n: int) -> ListNode:dummy = ListNode(0, head)  # 添加哑节点,方便处理边界情况fast = slow = dummy  # 快慢指针初始化指向哑节点# 让快指针先走 n+1 步,这样 slow 指向待删除节点的前一个节点for _ in range(n + 1):fast = fast.next# 同时移动快慢指针,直到快指针到达链表尾部while fast:fast = fast.nextslow = slow.next# 删除倒数第 n 个节点slow.next = slow.next.nextreturn dummy.next  # 返回真正的头节点

复杂度分析

  • 时间复杂度: O(n),只遍历了一次链表。
  • 空间复杂度: O(1),只用了常数级额外空间。

示例

# 构造链表 1 -> 2 -> 3 -> 4 -> 5
head = ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5)))))# 删除倒数第 2 个节点
new_head = removeNthFromEnd(head, 2)# 打印新链表
cur = new_head
while cur:print(cur.val, end=" -> ")cur = cur.next
# 输出:1 -> 2 -> 3 -> 5 ->

这个方法使用了 哑节点(dummy node),有效地避免了删除头节点的特殊情况,使代码更加简洁稳健。

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

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

相关文章

vue2的webpack(vue.config.js) 怎么使用请求转发 devServer.proxy

首先用 express 搭建后端服务器,注意使用中间件解析json格式的请求体,才会获取到 post 参数 app.use(express.json()); app.js const express require(express) const app express() app.use(express.json()); const port 3000app.post(/api/vue2, …

Linux:基本指令与内涵理解

1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式:ls (选项) (查看层级) 其中选项处不写就默认是显示文件名,查看层级默认是当前层级 选项1: -l 作用:将查找文件的详细信息显示出来 我们…

SpaceSync智能排班:重构未来办公空间的神经中枢

文心智能体平台可免费使用DeepSeek 满血版啦,使用DeepSeek模型创建并提交智能体,即有机会瓜分万元奖金!有这等好事还不快冲! 文心智能体官网:文心智能体平台AgentBuilder | 想象即现实 本片文章为作者参加文心智能体平…

flutter dio库 源码赏析

1. factory函数 //调用factory构造方法后,实际返回的是Dio的子类 Dio dio Dio();abstract class Dio {factory Dio([BaseOptions? options]) > createDio(options); } 2. CancelToken 作用:取消操作 CancelToken cancelToken CancelToken();//监听取消 ca…

RGV调度算法

1、基于时间窗 https://wenku.baidu.com/view/470e9fd8b4360b4c2e3f5727a5e9856a57122693.html?_wkts_1741880736197&bdQuery%E7%8E%AF%E7%A9%BF%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95 2.2019年MathorCup高校数学建模挑战赛B题 2019-mathorcupB题-环形穿梭机调度模型&a…

基于CATIA VBA与Python的自动化音乐生成技术对比研究

在工程软件二次开发领域,CATIA 也可以许多另类的玩法。通过CATIA自带的VBA可以演奏歌曲,但实际效果往往差强人意。为了进一步优化实际演奏效果,本文以自动生成林宥嘉《说谎》钢琴前奏旋律为案例,探讨两种语言在多媒体控制领域的技…

最大数位置(信息学奥赛一本通-2038)

【题目描述】 输入n个整数,存放在数组a[1]至a[n]中,输出最大数所在位置(n≤1000)。 【输入】 第一行,数的个数n; 第二行,n个正整数,每个数在232−1之内。 【输出】 最大数所在位置。 【输入样例】 5 67 43 90 78 32 【输出样例】 …

【AIGC】OpenAI 集成 Langchain 操作实战使用详解

目录 一、前言 二、前置准备 2.1 安装 Langchain必须的依赖 2.1.1 python环境 2.1.2 langchain openai 环境 2.1.3 准备一个apikey 2.1.4 langchain 核心组件 三、Langchain 各组件使用 3.1 Chat models组件 3.1.1 Invocation 使用 3.1.1.1 结果解析 3.2 提示词模板…

【C#学习笔记04】深入掌握C语言格式化输出

引言 ​​printf()​​函数不仅可以将数据输出到控制台,还可以通过格式化字符串灵活地控制输出的格式。​​printf()​​​函数的使用规则,包括标志说明、字段宽度、转换精度、长度修饰、转换说明、转义字符和返回结果等内容。 1. ​​printf()​​函数…

python-leetcode-定长子串中元音的最大数目

1456. 定长子串中元音的最大数目 - 力扣(LeetCode) 可以使用 滑动窗口 方法来解决这个问题。步骤如下: 初始化:计算前 k 个字符中元音字母的个数,作为初始窗口的值。滑动窗口:遍历字符串,每次右…

蓝桥真题讲解

第一题 题目链接 0贪吃蛇长度 - 蓝桥云课 题目解析 题意:数#个数和个数再加上首尾 代码原理 略 代码编写 略 填空题技巧 眼看手数 当然并不是真的一个一个数,我们需要借助一些工具,不过各位小伙伴们放心,我们借助的工具…

【C++ 函数模板】—— 模板参数推导、实例化策略与编译优化

欢迎来到ZyyOvO的博客✨,一个关于探索技术的角落,记录学习的点滴📖,分享实用的技巧🛠️,偶尔还有一些奇思妙想💡 本文由ZyyOvO原创✍️,感谢支持❤️!请尊重原创&#x1…

Java基础入门流程控制全解析:分支、循环与随机数实战

引言 流程控制是编程语言的核心逻辑结构,决定了程序的执行顺序与逻辑判断能力。本文以 分支结构、循环结构 和 随机数生成 为核心,结合代码示例与底层原理,全面解析Java中流程控制的应用场景与实战技巧。 一、分支结构 1. if分支 作用&am…

Redis 数据持久化之RDB

Redis数据持久化策略 持久化策略之RDB RDB:在指定的时间间隔,执行数据集的时间点快照。 实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是读快照。这样一来即使故障宕机,快照文件也不会丢失&…

数据分析与AI丨AI Fabric:数据和人工智能架构的未来

AI Fabric 架构是模块化、可扩展且面向未来的,是现代商业环境中企业实现卓越的关键。 在当今商业环境中,数据分析和人工智能领域发展可谓日新月异。几乎每天都有新兴技术诞生,新的应用场景不断涌现,前沿探索持续拓展。可遗憾的是&…

MyBatis - XML 操作动态 SQL

目录 1. 前言 2. 动态插入 2.1 if 标签 2.2 trim 标签 2.2.1 注解完成动态 SQL 3. 动态查询 3.1 添加 1 1 3.2 where 标签 4. 动态更新 4.1 set 标签 5. foreach 标签 6. sql 标签 & include 标签 1. 前言 之前博文所讲的 MyBatis SQL 操作, 都必须按照注解或…

【最佳实践】Go 责任链模式实现参数校验

这里我们使用责任链模式来创建一个参数校验的示例。在这个示例中,我们将实现一个简单的责任链来校验不同的参数条件。这种模式允许我们将多个校验步骤串联在一起,以便可以在不同的条件下进行灵活的校验。 设计思路 接口定义 (Validator) 目的&#xff1…

深入理解Tomcat:Java Web服务器的安装与配置

大家好!今天我们来聊聊Java Web开发中最重要的工具之一——Apache Tomcat。Tomcat是一个开源的Java Servlet容器和Web服务器,它是运行Java Web应用程序的核心环境。无论是开发、测试还是部署Java Web应用,Tomcat都是不可或缺的工具。本文将详…

小程序酒店:如何实现智能预订与在线支付?

在移动互联网快速发展的今天,酒店行业面临着前所未有的机遇与挑战。用户需求日益多样化,市场竞争愈发激烈,传统酒店预订方式已经难以满足现代消费者的需求。而小程序作为一种轻量化、便捷化的移动应用形式,正在成为酒店行业数字化转型的重要工具。通过小程序开发,酒店可以…

C#实现AES-CBC加密工具类(含完整源码及使用教程)

一、AES-CBC加密应用场景 AES(Advanced Encryption Standard)作为全球公认的安全加密标准,广泛使用在以下场景: API通信加密:保护HTTP接口传输的敏感数据(如身份令牌、支付信息)文件安全存储&…