news 2026/11/6 0:28:09

LeetCode 2095. 删除链表的中间节点【链表,快慢指针】中等

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 2095. 删除链表的中间节点【链表,快慢指针】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个链表的头节点head。删除链表的中间节点,并返回修改后的链表的头节点head。

长度为n链表的中间节点是从头数起第⌊n / 2⌋个节点(下标从0开始),其中⌊x⌋表示小于或等于x的最大整数。

  • 对于n=1、2、3、4和5的情况,中间节点的下标分别是0、1、1、2和2。

示例 1:

输入:head=[1,3,4,7,1,2,6]输出:[1,3,4,1,2,6]解释: 上图表示给出的链表。节点的下标分别标注在每个节点的下方。 由于 n=7,值为7的节点3是中间节点,用红色标注。 返回结果为移除节点后的新链表。

示例 2:

输入:head=[1,2,3,4]输出:[1,2,4]解释: 上图表示给出的链表。 对于 n=4,值为3的节点2是中间节点,用红色标注。

示例 3:

输入:head=[2,1]输出:[2]解释: 上图表示给出的链表。 对于 n=2,值为1的节点1是中间节点,用红色标注。 值为2的节点0是移除节点1后剩下的唯一一个节点。

提示:

  • 链表中节点的数目在范围[1, 10^5]内
  • 1 <= Node.val <= 10^5

方法 快慢指针

前置题目:[[LeetCode 876. 链表的中间结点【快慢指针】简单]]。

为了删除链表的中间节点,我们要让慢指针少走一步,移动到中间节点的前一个节点。怎么让慢指针少走一步?

可以先让快指针走两步,少循环一次,这样慢指针就少走一步了。

特判只有一个节点的情况(快指针没法走两步),返回空节点。

/** * 使用假的头节点时 * 奇数长度,快指针 第二步为空 表示 慢指针已经到了 中间节点前一个 * 偶数长度,快指针 第一步为空 表示 慢指针已经到了 中间节点前一个 * * 不使用假的头节点,为了让慢指针少走一步,可以让快指针抢跑两步 * 只有一个节点返回空 */classSolution{publicListNodedeleteMiddle(ListNodehead){if(head.next==null){// 只有一个节点returnnull;}// 876. 链表的中间结点// 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点ListNodeslow=head;ListNodefast=head.next.next;while(fast!=null&&fast.next!=null){slow=slow.next;fast=fast.next.next;}slow.next=slow.next.next;// 删除 slow 的下一个节点returnhead;}}
classSolution{public:ListNode*deleteMiddle(ListNode*head){if(head->next==nullptr){// 只有一个节点returnnullptr;}// 876. 链表的中间结点// 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点ListNode*slow=head;ListNode*fast=head->next->next;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}slow->next=slow->next->next;// 删除 slow 的下一个节点returnhead;}};
classSolution:defdeleteMiddle(self,head:Optional[ListNode])->Optional[ListNode]:ifhead.nextisNone:# 只有一个节点returnNone# 876. 链表的中间结点# 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点slow=head fast=head.next.nextwhilefastandfast.next:slow=slow.nextfast=fast.next.nextslow.next=slow.next.next# 删除 slow 的下一个节点returnhead
funcdeleteMiddle(head*ListNode)*ListNode{ifhead.Next==nil{// 只有一个节点returnnil}// 876. 链表的中间结点// 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点slow:=head fast:=head.Next.Nextforfast!=nil&&fast.Next!=nil{slow=slow.Next fast=fast.Next.Next}slow.Next=slow.Next.Next// 删除 slow 的下一个节点returnhead}
implSolution{pubfndelete_middle(head:Option<Box<ListNode>>)->Option<Box<ListNode>>{ifhead.as_ref()?.next.is_none(){// 只有一个节点returnNone;}// 876. 链表的中间结点// 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点letmutslow=&head;letmutfast=&head.as_ref()?.next.as_ref()?.next;whilefast.is_some()&&fast.as_ref()?.next.is_some(){slow=&slow.as_ref()?.next;fast=&fast.as_ref()?.next.as_ref()?.next;}// 只读引用 -> 只读裸指针 -> 可变裸指针letmutslow=slowas*constOption<Box<ListNode>>as*mutOption<Box<ListNode>>;// 可变裸指针 -> 可变引用letslow=unsafe{&mut*slow};slow.as_mut()?.next=slow.as_mut()?.next.take()?.next;// 删除 slow 的下一个节点head}}
vardeleteMiddle=function(head){if(head.next===null){// 只有一个节点returnnull;}// 876. 链表的中间结点// 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点letslow=head;letfast=head.next.next;while(fast&&fast.next){slow=slow.next;fast=fast.next.next;}slow.next=slow.next.next;// 删除 slow 的下一个节点returnhead;};
structListNode*deleteMiddle(structListNode*head){if(head->next==NULL){// 只有一个节点returnNULL;}// 876. 链表的中间结点// 本题先让快指针走两步,这样慢指针少走一步,刚好落在中间节点的前一个节点structListNode*slow=head;structListNode*fast=head->next->next;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}slow->next=slow->next->next;// 删除 slow 的下一个节点returnhead;}

复杂度分析:

  • 时间复杂度:O ( n ) O(n)O(n),其中n nn是链表的长度。
  • 空间复杂度:O ( 1 ) O(1)O(1)。

专题训练

链表题单的【1.6 快慢指针】。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/5 4:41:00

数据科学四条职业路径:分析、工程、建模与产品型

1. 这不是“转行指南”&#xff0c;而是一张数据科学从业者的现实路径图“4 Pathways to Data Science”这个标题&#xff0c;我第一次看到时心里就咯噔一下——又一个被过度简化的概念包装。市面上太多文章把数据科学说成“学完Python统计就能进大厂”&#xff0c;结果新人花半…

作者头像 李华
网站建设 2026/11/5 5:16:43

Java毕业设计-基于 SpringBoot 的宠物之家综合管理系统的设计与实现 面向宠物服务场景的宠物之家管理平台设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/10/31 7:44:21

MUSE-Autoskill:让LLM智能体技能自我进化,从静态工具到动态生态

1. 项目概述&#xff1a;从静态技能到动态进化的跨越最近在琢磨一个事儿&#xff0c;咱们现在搞的LLM智能体&#xff0c;是不是有点太“死板”了&#xff1f;你给它写个工具函数&#xff0c;或者封装一个所谓的“技能”&#xff0c;它用起来是挺顺手&#xff0c;但这个技能本身…

作者头像 李华
网站建设 2026/11/1 23:27:18

构建个人数字身份标识:从理念到实践的全流程指南

1. 项目概述&#xff1a;从“djackh”看个人数字身份标识的构建与价值最近在整理自己的数字资产时&#xff0c;一个老问题又浮现在眼前&#xff1a;如何在互联网的汪洋大海里&#xff0c;建立一个统一、稳定且具有辨识度的个人标识&#xff1f;这不仅仅是起个网名那么简单&…

作者头像 李华
网站建设 2026/10/30 3:17:42

NPS面板HTTPS加密实战:Nginx反向代理与原生配置深度对比

1. 项目概述&#xff1a;为什么你的NPS面板需要HTTPS“铠甲”&#xff1f;如果你正在使用NPS&#xff08;一款优秀的内网穿透和端口转发工具&#xff09;的Web管理面板&#xff0c;并且还在用HTTP协议访问&#xff0c;那你的管理后台就像在互联网上“裸奔”。任何一个在同一个网…

作者头像 李华
网站建设 2026/11/1 23:28:20

深部矿井围岩失稳机理、监测预警与稳定性控制技术实战解析

1. 项目概述&#xff1a;当岩石不再沉默在矿山深处&#xff0c;当重型机械的轰鸣声成为背景音&#xff0c;最让一线工程师和技术人员神经紧绷的&#xff0c;往往不是设备的故障&#xff0c;而是头顶和四周那片看似沉默、实则充满变数的岩体。“深部矿井围岩失稳”&#xff0c;这…

作者头像 李华