---
title: 为10岁聪明学生彻底讲解链表反转的经典算法：通过图解、火车车厢比喻及三指针实现深入理解
created: 2026-03-18
updated: 2026-03-18
type: summary
tags: ["algorithm", "linkedlist", "notes", "pointers", "telegram"]
external: http://go/ui/posts/2201/
---

好，这题其实是**链表里最经典的一道题**，我会把你当成10岁但很聪明的学生来讲 —— 用“画图 + 直觉 + 一点点抽象”的方式，让你彻底理解，而不是死记代码。

---

# 🧠 一、题目在说什么？

题目：
👉 把这个链表：

```
1 → 2 → 3 → 4 → 5
```

变成：

```
5 → 4 → 3 → 2 → 1
```

本质就是：
👉 **把所有箭头反过来** ([AlgoMonster][1])

---

# 🧩 二、最关键的难点（很多人卡在这里）

链表不像数组！

你不能直接“倒着访问”，你只能：

👉 从头，一个一个往后走

所以问题变成：

💡 **你在走的过程中，怎么把方向反过来？**

---

# 🧪 三、用“火车车厢”来理解（最重要）

想象：

```
1 → 2 → 3 → 4 → 5
```

是一个火车：

* 每节车厢只知道“下一节是谁”
* 没有人知道“前面是谁”

---

现在你要做的是：

👉 **让每节车厢指向前一节**

---

# ⚠️ 关键危险点（必须理解！）

当你做：

```python
curr.next = prev
```

你就**断掉了原来的链**！！

所以必须先保存：

```python
next = curr.next
```

否则你会“丢失后面的车厢” 🚨

👉 这是这题最核心的点 ([leetcode.li-mao.net][2])

---

# 🔁 四、一步一步模拟（超级关键）

我们用三个指针：

```
prev = None
curr = head
```

---

### 初始：

```
prev = None
curr = 1 → 2 → 3 → 4 → 5
```

---

### 第一步：

```python
next = curr.next   # 保存 2
curr.next = prev   # 1 → None
```

变成：

```
None ← 1     2 → 3 → 4 → 5
```

然后移动：

```
prev = 1
curr = 2
```

---

### 第二步：

```python
next = 3
curr.next = 1
```

变成：

```
None ← 1 ← 2     3 → 4 → 5
```

---

不断重复…

---

### 最后：

```
None ← 1 ← 2 ← 3 ← 4 ← 5
```

👉 `prev` 就是新头！

---

# 🧾 五、标准 Python 写法（面试级）

```python
class Solution:
    def reverseList(self, head):
        prev = None
        curr = head
        
        while curr:
            next_node = curr.next   # 1️⃣ 先保存
            curr.next = prev        # 2️⃣ 反转
            prev = curr             # 3️⃣ 前进
            curr = next_node        # 4️⃣ 前进
        
        return prev
```

---

# 🧠 六、你必须记住的“口诀”

这题其实就4步循环：

```
1. 存 next
2. 反指针
3. prev 前进
4. curr 前进
```

---

# 🔥 七、为什么这是最优解？

* 时间复杂度：O(n)（只走一遍） ([sparkcodehub.com][3])
* 空间复杂度：O(1)（没有额外空间） ([sparkcodehub.com][3])

👉 面试官最喜欢这个版本

---

# 🧩 八、进阶（你可以继续思考）

如果你已经理解了上面这个：

我可以带你继续深入：

* 🔁 递归解法（更优雅，但更抽象）
* 🧠 为什么不能用数组 / stack（面试扣分点）
* 🧩 K 个一组翻转（LeetCode 25，进阶版）

---

# 🎯 最后一问（帮你确认是否真的理解）

你试着回答我：

👉 **为什么一定要先保存 `next_node`？如果不保存会发生什么？**

如果你能答出来，这题你就不是“会写”，而是**真正掌握了**。

[1]: https://algo.monster/liteproblems/206?utm_source=chatgpt.com "206. Reverse Linked List - In-Depth Explanation"
[2]: https://leetcode.li-mao.net/datastructure/206-reverselinkedlist?utm_source=chatgpt.com "Leetcode 206. Reverse Linked List | Leetcode"
[3]: https://www.sparkcodehub.com/leetcode/206/reverse-linked-list?utm_source=chatgpt.com "LeetCode 206: Reverse Linked List Solution in Python Explained"
