CHAPTER 05 · 结构操作

链表、栈与队列

训练指针关系、先进后出和先进先出,理解线性结构的不同约束。

3 个知识小节7 道分层练习5–6 天 建议周期
展开本章目录
  1. 学习之前
  2. 1. 链表重连与虚拟头结点
  3. 2. 链表快慢指针
  4. 3. 栈与单调栈保存未决状态
  5. 延伸阅读
  6. 分层练习
  7. 我的笔记
00

BEFORE LEARNING

先理解为什么学

链表训练引用关系,栈和队列训练处理顺序。它们共同要求你把“尚未完成的状态”显式保存下来。

开始前应具备

  • 理解对象引用和空指针
  • 掌握快慢指针
  • 能画出节点之间的连接

完成本章后

  • 熟悉虚拟头结点
  • 掌握链表快慢指针
  • 能用栈表达未完成状态
01

CORE LESSONS

知识讲义

01

LESSON

链表重连与虚拟头结点

什么时候想到它?

需要反转、删除、合并链表节点,尤其头结点也可能改变时使用 dummy 简化分支。

链表操作的难点不是遍历,而是修改连接时不丢失剩余部分。虚拟头结点让头部操作和中间节点操作使用同一套逻辑。

推导步骤

  1. 画出 prev、current、next
  2. 修改前保存后继
  3. 完成一条连接后再移动指针
  4. 可能修改头结点时增加 dummy
思维模板 / 伪代码
dummy.next = head
prev, current = None, head
while current:
  next_node = current.next
  current.next = prev
  prev, current = current, next_node
02

LESSON

链表快慢指针

什么时候想到它?

需要找中点、倒数位置或判断环,但无法通过下标随机访问链表。

快慢指针利用不同速度制造相对位移。检测环时,若存在环,两者会在环内相遇;删除倒数节点时,固定间距让慢指针停在目标前驱。

推导步骤

  1. 确定两个指针的初始位置
  2. 建立需要保持的距离或速度关系
  3. 先检查快指针及其 next
  4. 根据相遇或到达末尾解释结果
思维模板 / 伪代码
slow = fast = head
while fast and fast.next:
  slow = slow.next
  fast = fast.next.next
03

LESSON

栈与单调栈保存未决状态

什么时候想到它?

需要匹配最近元素、撤销操作,或寻找左/右侧第一个更大更小时使用。

普通栈保存嵌套关系,单调栈保存尚未找到答案的候选下标。新元素到来时,能被它解决的候选依次弹出。

推导步骤

  1. 定义栈内保存值还是下标
  2. 规定从栈底到栈顶的单调性
  3. 当前元素到来时解决栈顶候选
  4. 把仍未解决的当前状态压栈
思维模板 / 伪代码
stack = []
for i, value in enumerate(a):
  while stack and resolves(a[stack[-1]], value):
    j = stack.pop(); answer[j] = i - j
  stack.append(i)
02

READING

延伸阅读

先读完本站讲义并尝试练习;遇到推导不清的地方,再回到原始教程深入阅读。

03

PRACTICE LADDER

按作用分层练习

题量由知识点决定,不再固定为 5 道。先完成“入门”和“模板”,再做变式与综合;挑战题可以留到复习阶段。

入门认识结构模板独立复现变式迁移条件综合组合技巧挑战延后突破
01

链表重连与虚拟头结点

2 道 · 依次完成

LC 206模板简单

反转链表

Reverse Linked List

为什么选:掌握保存 next 与三指针重连。

指针重连建议 25 分钟
打开 LeetCode ↗
LC 21变式简单

合并两个有序链表

Merge Two Sorted Lists

为什么选:用 dummy 统一头结点和中间节点的拼接。

虚拟头结点建议 25 分钟
打开 LeetCode ↗
02

链表快慢指针

2 道 · 依次完成

LC 141入门简单

环形链表

Linked List Cycle

为什么选:通过速度差理解环内相遇。

快慢指针建议 20 分钟
打开 LeetCode ↗
LC 19综合中等

删除链表的倒数第 N 个结点

Remove Nth Node From End

为什么选:固定指针间距并删除目标前驱的 next。

快慢指针建议 35 分钟
打开 LeetCode ↗
03

栈与单调栈保存未决状态

3 道 · 依次完成

LC 20入门简单

有效的括号

Valid Parentheses

为什么选:用栈保存尚未匹配的左括号。

栈建议 20 分钟
打开 LeetCode ↗
LC 155变式中等

最小栈

Min Stack

为什么选:让辅助状态与主栈同步更新。

辅助栈建议 30 分钟
打开 LeetCode ↗
LC 739挑战中等

每日温度

Daily Temperatures

为什么选:用单调栈批量解决尚未找到更高温度的位置。

单调栈建议 40 分钟
打开 LeetCode ↗
04

PERSONAL NOTEBOOK

我的学习笔记

我如何识别这个模式?今天卡在哪里?下次需要先检查什么?

笔记保存在当前浏览器