3分钟搞定反转链表!动画演示迭代与递归两种方法,看完秒懂
你还在为反转链表面试题发愁?是否每次遇到递归解法都像在看天书?本文用动画演示+手把手代码注释,带你彻底搞懂链表反转的迭代与递归两种实现,从此算法面试不再慌!
读完本文你将掌握:
- 迭代法反转链表的三指针技巧(附动图演示)
- 递归解法的"从后往前"思考模式
- 6种编程语言的实现代码(Java/C++/Python/JS/Go/Swift)
- 常见面试变形题的解题思路
为什么反转链表如此重要?
反转链表(Reverse Linked List)是算法面试中的"常青树",在LeetCode上标记为简单题,但却是字节跳动、阿里等大厂面试的高频考题。这道题看似简单,却能有效考察候选人的指针操作能力和递归思维。
项目中完整教程:animation-simulation/链表篇/leetcode206反转链表.md
迭代法:三指针翻转魔法
迭代法是反转链表最直观的实现方式,核心思想是通过三个指针的配合,逐个改变节点的指向。
动画演示过程
下面的动画展示了1→2→3→4→5→NULL反转成5→4→3→2→1→NULL的全过程:

步骤分解
-
初始化指针:
low指针指向NULL(反转后的链表尾部)pro指针指向head(原链表头部)
-
循环反转:
- 用
temp临时保存pro的位置 pro指针后移一位(pro = pro.next)temp指向low(完成当前节点反转)low指针后移一位(low = temp)
- 用
-
终止条件:当
pro指针为NULL时,low指针就是新的头节点
代码实现(Python版)
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
# 特殊情况处理:空链表或只有一个节点
if head is None or head.next is None:
return head
low = None # 黄色指针:指向已反转部分的头节点
pro = head # 绿色指针:指向待反转部分的头节点
while pro is not None:
temp = pro # 橙色指针:临时保存当前节点
pro = pro.next # 移动绿色指针到下一个节点
temp.next = low # 反转当前节点的指向
low = temp # 移动黄色指针到当前节点
return low # 循环结束后,low成为新的头节点
六种语言完整实现:animation-simulation/链表篇/leetcode206反转链表.md
递归法:从后往前的优雅
递归解法代码更简洁,但理解起来更抽象。核心思路是"先递后归",先走到链表尾部,再从后往前逐个反转节点指向。
递归思路图解
原链表:1 → 2 → 3 → 4 → 5 → NULL
递归过程:
reverseList(1)
└── reverseList(2)
└── reverseList(3)
└── reverseList(4)
└── reverseList(5) # 返回5(基准情况)
└── 5.next = 4 # 反转5→4
└── 4.next = 3 # 反转4→3
└── 3.next = 2 # 反转3→2
└── 2.next = 1 # 反转2→1
1.next = NULL # 防止循环
返回5(新的头节点)
代码实现(Java版)
class Solution {
public ListNode reverseList(ListNode head) {
// 基准条件:到达链表尾部或空链表
if (head == null || head.next == null) {
return head;
}
// 递归处理剩余节点,pro指向最后一个节点
ListNode pro = reverseList(head.next);
// 反转当前节点与下一个节点的指向
head.next.next = head; // 相当于 4.next.next = 4(让5指向4)
head.next = null; // 防止形成环
return pro; // 返回新的头节点
}
}
递归技巧总结
- 找基准情况:当head.next为null时,说明到达最后一个节点,直接返回
- 递归处理子问题:reverseList(head.next)得到子链表的反转结果
- 反转当前节点:head.next.next = head(关键一步)
- 防止环形成:head.next = null
两种方法对比与选择
| 方法 | 时间复杂度 | 空间复杂度 | 特点 |
|---|---|---|---|
| 迭代法 | O(n) | O(1) | 直观易懂,指针操作,无栈开销 |
| 递归法 | O(n) | O(n) | 代码简洁,递归调用栈占用额外空间 |
面试建议:优先掌握迭代法,空间复杂度更优;递归法则能体现算法思维,可作为加分项。
常见面试变形题
掌握了基础反转后,这些变形题也能迎刃而解:
- 反转链表前N个节点:只需在迭代到第N个节点时停止
- 反转链表的一部分:找到反转起始点,按基础方法反转后重新连接
- K个一组反转链表:LeetCode 25题,结合迭代和递归的综合应用
项目资源与学习建议
算法学习需要动手实践,推荐结合项目中的动画演示和代码注释进行练习:
- 完整动画教程:animation-simulation/链表篇/leetcode206反转链表.md
- 更多链表题目:animation-simulation/链表篇/
- 配套面试网站:www.chengxuchu.com(项目作者开发的算法面试平台)
建议先自己尝试写代码,再对照教程中的动画和注释检查。遇到问题可以在项目仓库提交issue,或加入作者的学习交流群(详见项目README)。
总结
反转链表作为算法面试的基础题,掌握其两种实现方法至关重要。迭代法通过三指针配合,逐个反转节点;递归法则利用"从后往前"的思路,代码更简洁但需要理解递归调用栈。
建议初学者先掌握迭代法,熟悉指针操作后再挑战递归解法。项目中的动画演示是理解这两种方法的最佳工具,配合多语言代码实现,能帮助你彻底攻克这一经典算法题。
点赞收藏本文,下次面试前复习一遍,算法通过率提升50%!下期我们将讲解"环形链表"的检测与处理,敬请关注。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



