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

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

如果说数组考察的是对连续内存和边界的极限掌控,那么链表(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 和双指针,链表将成为你算法面试中最稳的得分项。

相关推荐
木木子2213 小时前
# 密码强度检测深度解析:正则表达式实时分析、多维度评分算法与可视化反馈
mysql·算法·华为·正则表达式·harmonyos
Sw1zzle16 小时前
算法入门(四):二叉树 - 递归遍历三件套
算法·leetcode
万法若空17 小时前
【算法-查找】查找算法
java·数据结构·算法
海石17 小时前
子树怎么找?树的3种遍历方式来帮忙!
算法·leetcode
海石17 小时前
难度分 1588:思路 + 技巧 = AC
算法·leetcode
珠海西格电力20 小时前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
还有多久拿退休金1 天前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby1 天前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀1 天前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince1 天前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法