【每日算法】LeetCode 19. 删除链表的倒数第 N 个结点

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode 19. 删除链表的倒数第 N 个结点

1. 题目描述

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

示例 1:

输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]

示例 2:

输入:head = [1], n = 2 输出:[1]

示例 3:

输入:head = [1,2], n = 1 输出:[1]

提示:

  • 链表中结点的数目为sz
  • 1 <= sz <= 30
  • 0 <= Node.val <= 100
  • 1 <= n <= sz

2. 问题分析

本题的核心挑战在于“倒数第N个”这个定位要求。单链表无法逆向回溯,因此必须通过正向遍历来找到这个特定位置。一个关键的边界情况是删除的可能是头节点,这需要我们仔细处理。

3. 解题思路

本题主要有两种主流思路,双指针(快慢指针)法是最优解。

3.1 思路一:两次遍历法(计算链表长度)

  1. 第一次遍历:获取链表的长度L
  2. 计算目标位置:需要删除的正数位置为L - n + 1
  3. 第二次遍历:移动到目标位置的前一个节点(即L - n的位置),执行删除操作。
  4. 时间复杂度:O(L),需要遍历链表两次。
  5. 空间复杂度:O(1)。

3.2 思路二:双指针(快慢指针)法【最优解】

  1. 设置哑节点(Dummy Node):在头节点前创建一个虚拟节点,其next指向head。这是处理链表删除问题的常用技巧,可以优雅地统一处理删除头节点和非头节点的情况,避免复杂的条件判断。
  2. 初始化快慢指针fastslow都指向哑节点。
  3. 快指针先行:让fast指针先向前移动n步。此时,fastslow之间相隔n个节点。
  4. 同步移动:同时移动fastslow,直到fast到达链表的末尾(fast.nextnull)。此时,slow恰好指向待删除节点的前一个节点。因为fastslow始终保持n的间距。
  5. 执行删除slow.next = slow.next.next
  6. 返回新头节点:返回dummy.next
  7. 时间复杂度:O(L),只遍历链表一次。
  8. 空间复杂度:O(1)。

为什么双指针法更优?
它不仅时间复杂度相同,而且在一次遍历中完成,逻辑清晰,代码简洁,是面试官最期望看到的解法。

4. 各思路代码实现(JavaScript)

4.1 两次遍历法实现

/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @param {number} n * @return {ListNode} */varremoveNthFromEnd=function(head,n){// 1. 第一次遍历:计算链表长度letlength=0;letcurrent=head;while(current!==null){length++;current=current.next;}// 2. 计算要删除节点的正数位置consttargetIndex=length-n;// 3. 处理删除头节点的特殊情况if(targetIndex===0){returnhead.next;}// 4. 第二次遍历:找到目标节点的前一个节点current=head;for(leti=0;i<targetIndex-1;i++){current=current.next;}// 5. 执行删除操作current.next=current.next.next;returnhead;};

4.2 双指针法实现【推荐】

/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @param {number} n * @return {ListNode} */varremoveNthFromEnd=function(head,n){// 1. 创建哑节点,其next指向原头节点constdummy=newListNode(0,head);// 2. 初始化快慢指针letfast=dummy;letslow=dummy;// 3. 快指针先走 n 步for(leti=0;i<n;i++){fast=fast.next;}// 4. 快慢指针同步前进,直到快指针到达链表末尾while(fast.next!==null){fast=fast.next;slow=slow.next;}// 循环结束时,slow指向待删除节点的前一个节点// 5. 删除节点slow.next=slow.next.next;// 6. 返回新头节点(哑节点的next)returndummy.next;};

5. 复杂度与优缺点对比

实现方案时间复杂度空间复杂度优点缺点
两次遍历法O(L), L为链表长度O(1)思路直观,易于理解和实现需要遍历链表两次,效率非最优;处理头节点删除需额外判断
双指针法(哑节点)O(L), L为链表长度O(1)只遍历一次,效率高代码统一简洁,哑节点技巧避免了头节点的特殊判断;面试和工程中的首选方案引入了额外的哑节点,但对空间复杂度无影响,逻辑上稍需理解

6. 总结与实际应用场景

6.1 总结

  1. 哑节点(Dummy Node)技巧:这是解决链表问题的“瑞士军刀”。它在链表头部之前创建一个虚拟节点,使得对头节点的操作(增、删)和对中间节点的操作逻辑完全一致,极大地简化了代码和逻辑判断。
  2. 快慢指针模式:这是链表算法的核心模式之一,不仅用于本题,还广泛应用于检测环形链表(LeetCode 141)寻找链表中点(LeetCode 876)寻找环形链表入口(LeetCode 142)等问题。
  3. 对“倒数第N个”的转化思维:通过快指针先走N步,将“倒数”问题转化为两个指针之间的“固定间隔”问题,这是一种非常巧妙的思维方式。

6.2 前端实际应用场景

  1. 虚拟DOM与Fiber架构:React的Fiber节点通过链表链接。在协调(Reconciliation)过程中,中断和恢复渲染的能力,本质上依赖于对这片“链表森林”的可控遍历。理解指针移动和节点操作,能帮你更深层理解React的调度机制。
  2. 长列表/无限滚动性能优化:在渲染成千上万条数据的列表时(如聊天记录、新闻流),通常采用“窗口化”技术,只渲染可视区域的部分节点。维护这些节点的缓存池、计算哪些节点应该进入或离开可视区,其数据结构的底层逻辑与链表操作息息相关。
  3. 撤销/重做(Undo/Redo)功能:编辑器的历史记录栈可以用双向链表来实现,每个节点保存一个状态。删除历史记录中的某一项,就类似于链表的删除操作。
  4. 路由历史记录管理:浏览器或前端路由库(如React Router)的历史记录管理,其前进、后退、替换等操作,底层都可以用链表模型来理解和设计。

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

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

相关文章

16、Linux系统下外设使用指南

Linux系统下外设使用指南 1. Linux与数字成像设备通信概述 在掌握了GIMP基本操作和数字图像处理技巧后,如何让数字成像设备与GIMP进行通信成为新的关注点。使用数字扫描仪和相机能让GIMP的使用更加有趣。本文的快速提示主要以Linux为中心,在其他UNIX变体系统中,部分步骤可…

2025年度北京五大靠谱大平层设计品牌企业推荐:资质齐全的大 - 工业品牌热点

在城市人居升级的浪潮中,大平层作为空中别墅的载体,不仅是物理空间的延伸,更是居住者生活态度与精神追求的具象化表达。面对市场上良莠不齐的设计机构,如何选择资质齐全的大平层设计品牌企业?以下依据专业度、落地…

Claude Code最佳助手Serena入门指南

Serena新手入门指南:让你的AI编程助手如虎添翼在AI编程时代,工具的选择决定了效率的上限🌟 什么是Serena? Serena是一个强大的MCP(Model Context Protocol)服务器,专门为IDE(集成开发环境)助手而设计。简单来…

LobeChat能否评估项目风险?提前预警潜在问题

LobeChat能否评估项目风险&#xff1f;提前预警潜在问题 在现代软件开发和项目管理中&#xff0c;一个常见的痛点是&#xff1a;风险往往在爆发前已有征兆&#xff0c;却因信息分散、响应滞后而被忽视。会议纪要里一句“进度可能延迟”&#xff0c;周报中提到的“关键人员请假”…

当毕业论文从“熬出来的任务”变为“走出来的路径”:一位本科生如何在AI协研工具的陪伴下,完成一次有方法、有规范、有成长的学术初旅?

在高校人才培养体系中&#xff0c;本科毕业论文正经历一场静默的转型——它不再仅是获取学位的“最后一关”&#xff0c;而被越来越多教育者视为**学术思维启蒙、科研流程体验与学术规范养成的关键载体。然而&#xff0c;对绝大多数首次独立开展研究的本科生而言&#xff0c;这…

TensorRT-LLM离线环境搭建与Bloom模型量化推理

TensorRT-LLM离线环境搭建与Bloom模型量化推理 在当前大语言模型&#xff08;LLM&#xff09;加速落地的背景下&#xff0c;如何将百亿甚至千亿参数的模型高效部署到生产环境&#xff0c;成为AI基础设施团队的核心挑战。推理延迟高、显存占用大、吞吐量低——这些问题直接制约了…

腾讯混元开源HunyuanVideo-Foley:实现声画合一的AI音效革命

腾讯混元开源HunyuanVideo-Foley&#xff1a;实现声画合一的AI音效革命 在短视频日均产量突破千万条的今天&#xff0c;一个令人尴尬的事实是&#xff1a;大多数AI生成视频依然“沉默无声”。即便画面流畅、构图精美&#xff0c;一旦缺少匹配的声音细节——脚步踩在石板上的清…

FLUX.1-dev本地部署与镜像下载全指南

FLUX.1-dev本地部署与镜像下载全指南 在生成式AI的竞技场上&#xff0c;图像模型早已从“能画出来就行”进化到“懂你所想、绘你所思”的新阶段。&#x1f3a8; 而最近横空出世的 FLUX.1-dev&#xff0c;正是这场技术跃迁中最具野心的一次尝试——它不满足于做一名只会听指令画…

Excalidraw应用案例与最佳实践解析

Excalidraw&#xff1a;当手绘草图遇上智能协作 在一次跨国产品评审会上&#xff0c;一位架构师用30秒画出一张看似随意的草图——几个歪歪扭扭的方框、几条带箭头的连线&#xff0c;还有一团代表“遗留系统”的潦草涂鸦。但正是这张图&#xff0c;让分布在三个时区的团队瞬间达…

《60天AI学习计划启动 | Day 04: 流式响应实现 - 打造流畅的AI对话体验》

Day 04: 流式响应实现 - 打造流畅的AI对话体验 📋 学习目标理解流式响应概念掌握 Server-Sent Events (SSE)实现 OpenAI Stream API前端实时显示 AI 回复优化用户体验📚 核心学习内容 1. 流式响应 vs 普通响应 普通…

抢占AI流量入口:深度云海如何以全链路GEO方案赋能企业增长 - 深度智识库

在AI搜索用户渗透率已突破50%的当下,用户获取信息的方式正从“主动搜索网页”全面转向“向AI直接提问”。这一深刻变革,意味着企业若想继续抢占流量入口,传统的SEO优化已逐渐失效,生成式引擎优化(GEO)已成为一项…

EmotiVoice:开源多情感TTS重塑声音表达

EmotiVoice&#xff1a;让机器声音学会“共情” 你有没有过这样的体验&#xff1f;打开导航&#xff0c;机械的女声说“前方左转”&#xff0c;语气平静得仿佛在播报天气&#xff1b;给孩子读电子绘本&#xff0c;AI念到“大灰狼吓坏了小红帽”时&#xff0c;却毫无紧张感——…

2025隐形车衣厂家TOP5权威推荐:甄选靠谱制造厂助力爱车 - 工业推荐榜

汽车后市场中,高品质隐形车衣需求持续攀升,2024年市场规模突破200亿元,但30%的投诉集中在产品黄变、施工劣质、售后无保障等问题。车主常踩坑:低价膜半年黄变开裂,手工裁膜划伤原厂漆,售后推诿责任……面对乱象,…

期末复习分析+改错

文章目录一、程序分析题(20分)项目结构分析题01运行结果分析题02运行结果分析题03运行结果分析题04运行结果二、程序改错题(20分)项目结构改错题01知识点改错题02知识点改错题03知识点改错题04知识点改错题05知识点改错题06知识点一、程序分析题(20分) 项目结构 分析题01 运行…

LobeChat能否标记不确定性?避免过度自信输出

LobeChat 能否标记不确定性&#xff1f;破解 AI 过度自信的工程实践 在医疗咨询中&#xff0c;一个AI助手斩钉截铁地推荐某种药物剂量&#xff1b;在金融分析场景里&#xff0c;模型自信满满地预测某支股票下周将暴涨30%——这些看似权威的回答背后&#xff0c;可能只是模型“一…

22、Perl正则表达式与程序交互全解析

Perl正则表达式与程序交互全解析 1. 正则表达式基础 正则表达式在Perl中是非常强大的工具,能在很多场景发挥重要作用。 1.1 正则表达式与split函数 在处理数据时, split 函数常与正则表达式配合使用。正常情况下,我们可以按固定字符分割字符串,例如: my @array = …

LobeChat能否连接AR眼镜?增强现实对话

LobeChat 能否连接 AR 眼镜&#xff1f;让增强现实“开口说话” 在工业产线的轰鸣声中&#xff0c;一位工程师戴着AR眼镜缓步前行。他目光扫过一台设备&#xff0c;轻声说&#xff1a;“显示这台电机的最近三次故障记录。”话音刚落&#xff0c;一串时间线便浮现在眼前&#xf…

2025年汽车太阳膜五大品牌排行榜,新测评精选汽车膜品牌推荐 - myqiye

为帮车主高效锁定适配自身需求的汽车太阳膜品牌,避免选购走弯路,我们从隔热防晒性能、视野信号兼容性、安全隐私防护、环保耐用性及真实用户口碑五大维度,对多家品牌展开深度评估,终精心筛选出2025年值得车主信赖的…

零基础搭建Qwen-Image+Gradio绘画WebUI

零基础搭建Qwen-ImageGradio绘画WebUI 在AI生成内容&#xff08;AIGC&#xff09;快速发展的今天&#xff0c;越来越多的设计师、开发者甚至普通用户都希望拥有一套属于自己的本地化图像生成工具。而通义千问团队推出的 Qwen-Image 模型&#xff0c;凭借其200亿参数的MMDiT架构…

SAM2源码阅读

sam2 这个项目的实时推理实现要点如下&#xff1a; 项目实时推理实现分析 这是一个基于 SAM2 (Segment Anything Model 2) 的实时视频分割项目&#xff0c;实现了对实时视频流的在线分割与跟踪。 1. 核心架构设计 项目采用 SAM2CameraPredictor 类来处理实时视频流&#xff1a;…