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

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

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

相关推荐
AOwhisky11 小时前
Ceph系列第一期:Ceph分布式存储核心概念与架构初识
linux·运维·笔记·分布式·ceph·学习·架构
wuweijianlove11 小时前
算法复杂度评估的实验统计方法与可视化的技术7
算法
名不经传的养虾人11 小时前
从0到1:企业级AI项目迭代日记 Vol.35|追问比演示重要——技术团队问出的五个工程缺口
人工智能·算法·机器学习·ai编程·ai工作流·企业ai
zavoryn11 小时前
大模型入门:面试必会 RoPE,从位置编码到旋转位置嵌入
算法·面试
05候补工程师11 小时前
【408高分笔记】数据结构冲刺:二叉树遍历性质、特殊形态与栈的跨界联动秒杀技巧
数据结构·经验分享·笔记·考研·算法
菜菜的顾清寒11 小时前
力扣HOT100(36)二分查找-搜索插入位置
数据结构·算法·leetcode
眼眸流转11 小时前
Dify学习笔记
笔记·学习·agent·dify
一只QAQ11 小时前
c++小巧思
c++·笔记·学习