算法实战笔记:链表的底层逻辑与指针的高阶玩法(二)

算法实战笔记:链表的底层逻辑与指针的高阶玩法(二)

如果说数组考察的是对连续内存和边界的极限掌控,那么链表(Linked List)考察的就是对指针调度的空间想象力

很多同学在做链表题时,脑子里的思路很清晰,但一写代码就立刻遭遇 NullPointerException(空指针异常),或者不小心把链表"弄断了"导致死循环。

其实,搞定链表只需要掌握两个核心法宝:虚拟头节点(Dummy Node)双指针法(快慢指针)。本篇笔记将带你系统拆解链表的五大高频场景,助你彻底告别链表恐惧症。

一、 降维打击:虚拟头节点(Dummy Node)

链表操作中最大的痛点是什么?是头节点的尴尬地位

在链表中,我们如果想要增删一个节点,必须找到它的前驱节点 。但是,头节点没有前驱节点!这就导致我们在编写代码时,每次遇到涉及头节点的操作,都必须写单独的 if 逻辑来特殊处理。这种代码不仅冗长,而且极易出错。

破局之道:引入虚拟头节点(Dummy Node)。

我们在真正的头节点前面,人为地"造"一个假节点,让它的 next 指向真正的头节点。

  • 好处:这样一来,原来的头节点就变成了普通节点,链表中的所有节点都拥有了前驱节点。增删改查的逻辑得到了完美的统一,再也不用为头节点写恶心的特殊判断了。

二、 扎马步:链表的五大基本操作

在开始刷高阶算法题之前,必须要过基础关。你能否不用任何现成的数据结构,纯手写实现一个链表类的以下五个核心操作?

  1. 获取第 index 个节点的数值
  2. 在链表最前面插入一个节点(利用 Dummy Node 轻松搞定)
  3. 在链表最后面插入一个节点
  4. 在第 index 个节点前插入一个节点
  5. 删除第 index 个节点

避坑指南 :把这五个操作连贯地写一遍,重点体会操作顺序 。比如插入节点时,一定要先连后断(新节点先指向后面的节点,前驱节点再指向新节点),顺序一反,链表就会在内存中彻底丢失。

三、 面试试金石:反转链表

"听说过两天反转链表又写不出来了?" 这是一道极其经典、极高频的面经题。

反转链表不需要额外申请新的内存空间,只需要改变节点间 next 指针的指向即可。这道题通常有两种解法:

  1. 迭代法(双指针/头插法) :定义一个 pre 指针(初始为 null)和一个 cur 指针(指向头节点)。遍历链表,每次让 cur.next 指向 pre,然后 precur 依次向后平移。
  2. 递归法:逻辑较为绕脑。建议先彻底学透、写熟迭代法,再去理解递归法。如果迭代的指针反转过程在脑海里还不清晰,强行看递归只会一头雾水。

四、 封神技巧:双指针在链表中的妙用

如果说虚拟头节点解决了边界问题,那么双指针法(快慢指针)就是解决链表复杂问题的银弹。以下三大经典场景,全部依赖双指针完美破局:

场景 1:删除链表倒数第 N 个节点

只遍历一次链表怎么找到倒数第 N 个节点?

  • 解法:准备一个快指针(Fast)和一个慢指针(Slow),都指向虚拟头节点。先让 Fast 走 N 步,然后 Fast 和 Slow 同时齐步走。当 Fast 走到链表末尾(null)时,Slow 刚好停在待删除节点的前驱节点上。
场景 2:找两个单链表的相交节点

两个链表长度不同,如何找到它们的物理内存交点?

  • 解法 :分别遍历求出两链表的长度,算出长度差 diff。让较长链表的指针先走 diff 步,使得两个链表的剩余长度对齐。接着两个指针同时向后走,它们第一次指向同一个节点(内存地址相同)时,即为交点。
场景 3:环形链表(最难理解的智力题)

如何判断链表有环?如果有环,如何找到环的入口?

这道题需要一些数学思维,分两步走:

  1. 判断是否有环:快指针每次走两步,慢指针每次走一步。如果链表有环,它们一定会在环内相遇。
  2. 寻找环入口(核心小结论) :当快慢指针相遇时,立刻派出一个新指针 1 从链表头节点 出发,同时让新指针 2 从相遇点 出发,两个指针每次都只走一步。当这两个指针相遇时,相遇的节点绝对就是环的入口处!

结语

从基础的增删改查,到虚拟头节点的防御性编程,再到双指针法的空间艺术,链表的题目看似千变万化,但万变不离其宗。只要你在做题时,能在脑海里清晰地画出指针(箭头)断开与重连的画面,并熟练运用 Dummy Node 和双指针,链表将成为你算法面试中最稳的得分项。

相关推荐
额额额对了3 分钟前
数据结构:二叉树
c语言·数据结构·算法
iNeuOS工业互联网16 分钟前
iNeuOS_Vision_视觉分析,增加SAM3模型对实例分割和目标检测AI自动标注图片样本功能
人工智能·算法·目标检测
qeen8726 分钟前
【数据结构】红黑树的算法原理解析与实现
开发语言·数据结构·c++·算法·红黑树
阿里巴巴首席技术官36 分钟前
目标检测基础
笔记·yolo
码匠许师傅1 小时前
【C++ 面试真题】20. 聊聊 C++ 的标准库常用算法
c++·算法·面试
TJHHH.1 小时前
SQL注入学习总结
数据库·笔记·sql·学习·注入
自小吃多1 小时前
Capture软件原理图添加元器件笔记
笔记·嵌入式硬件
m0_547486661 小时前
《数据结构与算法(Python语言版)》全套PPT课件2026
数据结构·算法
TJHHH.2 小时前
文件包含漏洞
笔记·安全·文件包含
个 人 练 习 生2 小时前
数据结构入门:算法复杂度
开发语言·数据结构·经验分享·学习·程序人生·算法