链表操作实战:移除元素、设计链表与反转链表
1. 链表基础与算法训练营实战作为一名经历过无数次算法面试的老兵我深知链表操作是每个程序员必须跨过的门槛。今天要分享的是代码随想录算法训练营第三天的核心内容——三个经典的链表问题移除链表元素、设计链表和反转链表。这三个题目看似简单却涵盖了链表操作中最关键的增删改查技巧。链表作为线性表的链式存储结构与数组相比最大的特点就是动态内存分配。每个节点包含数据域和指针域通过指针将零散的内存块串联起来。这种结构使得插入和删除操作的时间复杂度可以降到O(1)但同时也失去了随机访问的能力。在实际工程中链表广泛应用于操作系统内核、数据库索引和内存管理等场景。提示理解链表的关键在于掌握指针操作。建议在纸上画出节点间的连接关系操作指针前先明确每个指针的指向。2. LeetCode 203 移除链表元素2.1 问题分析与暴力解法给定一个链表和一个值val删除链表中所有等于val的节点。例如 输入1-2-6-3-4-5-6, val 6 输出1-2-3-4-5最直接的思路是遍历链表遇到目标节点就删除。但这里有个陷阱头节点的处理。当头节点的值等于val时需要特殊处理。我最初写出的代码如下def removeElements(head, val): # 处理头节点 while head and head.val val: head head.next # 处理非头节点 curr head while curr and curr.next: if curr.next.val val: curr.next curr.next.next else: curr curr.next return head这种方法虽然可行但代码中存在重复的条件判断。更优雅的解法是使用虚拟头节点(dummy node)技巧。2.2 虚拟头节点优化虚拟头节点是在原链表前添加的一个辅助节点它的next指向真正的头节点。这样所有节点都可以用统一的方式处理def removeElements(head, val): dummy ListNode(nexthead) curr dummy while curr.next: if curr.next.val val: curr.next curr.next.next else: curr curr.next return dummy.next这个版本代码更简洁且时间复杂度为O(n)空间复杂度O(1)。虚拟头节点技巧在链表问题中非常实用特别是在需要修改头节点的情况下。注意Python中要注意节点的释放问题。虽然Python有垃圾回收机制但在C等语言中删除节点后需要手动释放内存。3. LeetCode 707 设计链表3.1 链表ADT设计要点这道题要求实现一个完整的链表类支持以下操作get(index)addAtHead(val)addAtTail(val)addAtIndex(index, val)deleteAtIndex(index)设计链表ADT时需要考虑几个关键点选择单链表还是双链表是否使用虚拟头节点如何维护链表长度边界条件处理索引越界等我选择实现一个带虚拟头节点的单链表这样可以简化插入和删除操作class ListNode: def __init__(self, val0, nextNone): self.val val self.next next class MyLinkedList: def __init__(self): self.dummy ListNode() # 虚拟头节点 self.size 0 def get(self, index: int) - int: if index 0 or index self.size: return -1 curr self.dummy.next for _ in range(index): curr curr.next return curr.val def addAtHead(self, val: int) - None: self.addAtIndex(0, val) def addAtTail(self, val: int) - None: self.addAtIndex(self.size, val) def addAtIndex(self, index: int, val: int) - None: if index self.size: return prev self.dummy for _ in range(index): prev prev.next new_node ListNode(val, prev.next) prev.next new_node self.size 1 def deleteAtIndex(self, index: int) - None: if index 0 or index self.size: return prev self.dummy for _ in range(index): prev prev.next prev.next prev.next.next self.size - 13.2 时间复杂度分析get: O(n)addAtHead: O(1)addAtTail: O(n) 可以优化为O(1)如果维护尾指针addAtIndex: O(n)deleteAtIndex: O(n)在实际工程中如果频繁在尾部操作应该维护一个尾指针。这也是面试中常见的follow-up问题。4. LeetCode 206 反转链表4.1 迭代解法反转链表是链表操作中最经典的题目之一。迭代法的思路是用三个指针prev、curr和next逐个反转节点间的指向关系。def reverseList(head): prev None curr head while curr: next_node curr.next # 暂存下一个节点 curr.next prev # 反转指针 prev curr # 移动prev curr next_node # 移动curr return prev这个解法的时间复杂度是O(n)空间复杂度O(1)。关键在于理解指针移动的顺序和临时变量的必要性。4.2 递归解法递归解法更加简洁但理解起来需要一定的递归思维def reverseList(head): if not head or not head.next: return head new_head reverseList(head.next) head.next.next head head.next None return new_head递归的终止条件是当前节点为空或下一个节点为空。递归的核心思想是先反转后面的链表再将当前节点接到已反转链表的末尾。实操心得递归解法虽然简洁但在处理超长链表时可能会导致栈溢出。在实际工程中更推荐使用迭代法。5. 链表操作常见问题与技巧5.1 边界条件处理链表操作中最容易出错的就是边界条件。以下是我总结的检查清单链表为空时的情况只有一个节点时的情况处理头节点和尾节点时的情况索引越界的情况对于需要索引的操作5.2 调试技巧链表问题调试起来比较困难因为无法直接打印整个链表。我常用的调试方法实现一个打印链表的辅助函数在纸上画出指针变化的过程使用调试器逐步跟踪指针变化对特殊情况进行单元测试5.3 性能优化方向虽然链表的基本操作时间复杂度已经是理论最优但在实际应用中还可以考虑使用双向链表减少某些操作的时间复杂度维护尾指针加速尾部操作使用跳表(skip list)优化查找效率考虑内存局部性使用内存池分配节点6. 算法训练营的学习方法参加算法训练营是提升算法能力的有效途径。根据我的经验高效的学习方法包括每道题目至少做三遍第一遍自己思考第二遍学习优秀解法第三遍隔天复习建立错题本记录易错点和解题思路参与讨论区交流学习他人解法定期总结同类题目的解题模板对于链表问题核心在于掌握指针操作和常见技巧如虚拟头节点、快慢指针等。通过这三个题目的练习你应该能够建立起解决大多数链表问题的信心。

相关新闻

G-Helper:华硕笔记本的终极轻量级控制中心完全指南

G-Helper:华硕笔记本的终极轻量级控制中心完全指南

G-Helper:华硕笔记本的终极轻量级控制中心完全指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exper…

2026/10/12 2:19:40 阅读更多 →
如何彻底掌控惠普OMEN游戏本性能?开源神器OmenSuperHub完整指南

如何彻底掌控惠普OMEN游戏本性能?开源神器OmenSuperHub完整指南

如何彻底掌控惠普OMEN游戏本性能?开源神器OmenSuperHub完整指南 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub …

2026/10/12 3:26:09 阅读更多 →
3步专业音源配置指南:构建你的高品质免费音乐库

3步专业音源配置指南:构建你的高品质免费音乐库

3步专业音源配置指南:构建你的高品质免费音乐库 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 你是否曾经为寻找免费而稳定的音乐资源而烦恼?当各大音乐平台会员费不断上涨…

2026/10/12 3:26:06 阅读更多 →

最新新闻

AI合规不止于模型:ISO/IEC 42001:2023 管理体系要点解析

AI合规不止于模型:ISO/IEC 42001:2023 管理体系要点解析

简介:《ISO/IEC 42001:2023》是ISO与IEC联合发布的首个人工智能管理体系国际标准,为各类组织在使用或开发AI产品与服务时建立、执行、维护并持续改进AI管理系统(AIMS)提供了权威框架。这份PDF文档内含完整正文和附录,共…

2026/10/13 23:02:16 阅读更多 →
openpyxl读取Excel实战:从单元格到大文件性能优化

openpyxl读取Excel实战:从单元格到大文件性能优化

接过一个统计报表的活儿,要在一堆 Excel 里提取数据并汇总。刚开始我图省事,直接用 pandas 一把梭,后来发现需求越来越细:要判断单元格格式、要区分公式和结果、要处理合并单元格和文本型数字,还得在大文件场景下控内存…

2026/10/13 23:02:16 阅读更多 →
计算机二级C语言备考攻略:吃透题库与操作题是关键

计算机二级C语言备考攻略:吃透题库与操作题是关键

计算机二级C语言,大概是全国计算机等级考试里报名量最大的一科。我身边有不少人抱着“多一个证总没坏处”的心态报了名,然后备考方式就是借一本C语言教材从第一页开始啃,啃到指针就放弃,最后上考场,选择题靠直觉&#…

2026/10/13 23:02:16 阅读更多 →
破解版资源不可取:如何合规分享技术资源与实战笔记

破解版资源不可取:如何合规分享技术资源与实战笔记

简介:Evp破解版工具是一款面向服务端开发、部署及运维人员的实用资源,主要解决服务端文件的解压与修改问题。根据页面描述,该工具在服务端场景中具有不可替代性——常规解压软件可能无法正确识别或处理服务端特殊文件结构,必须借助…

2026/10/13 23:02:16 阅读更多 →
C++/WinRT 文件处理实战:从 StorageFile 到异步读写与流式处理

C++/WinRT 文件处理实战:从 StorageFile 到异步读写与流式处理

如果你刚从 Win32 转过来写 C/WinRT,第一件需要适应的就是“文件不再是一个句柄”。过去我打开文件拿到 HFILE,然后 ReadFile、WriteFile,一套组合拳打完收工。到了 C/WinRT 里,文件被封装成了StorageFile对象,读文件不…

2026/10/13 23:02:16 阅读更多 →
Django+LLM+遗传算法:打造AI驱动的旅游路线规划与推荐系统

Django+LLM+遗传算法:打造AI驱动的旅游路线规划与推荐系统

每年毕业设计的选题库里,“旅游网站”几乎是大热门,但说实话,十个里面至少有八个做成了标准的增删改查演示——用户注册登录、景点列表、后台维护,顶多再加一个关键字搜索。答辩的时候老师问一句“技术亮点在哪里”,很…

2026/10/13 23:01:16 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →