【LeetCode 热题 100】206. 反转链表
📌 难度:简单
📚 标签:链表、双指针、迭代、递归
🔗 题目链接(LeetCode CN)
🧩 一、题目描述
给你单链表的头节点
head
,请你反转链表,并返回反转后的链表。
✅ 示例:
输入:
head = [1,2,3,4,5]
输出:
[5,4,3,2,1]
🔍 二、链表与 Python 列表的区别
很多初学者会误解输入 head = [1,2,3]
是 Python 列表。其实这是题目的简化表示方式,真正传入 reverseList
函数的是链表结构,如下:
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = next
链表在内存中的结构类似这样:
ListNode(1) → ListNode(2) → ListNode(3) → None
🧠 三、解题核心思路:三指针迭代法
反转链表的本质是:逐步改变每个节点的 next
指针方向。
📌 用到三个指针:
指针 | 含义 |
---|---|
cur | 当前正在处理的节点 |
pre | 当前节点的前一个节点(反转部分的头) |
tmp | 临时保存 cur.next ,防止链断 |
📊 四、图解执行流程
以链表 1 → 2 → 3 → None
为例:
初始状态:
pre = None
cur = 1
第一步:
tmp = cur.next # tmp = 2
cur.next = pre # 1 → None
pre = cur # pre = 1
cur = tmp # cur = 2
第二步:
tmp = 3
2 → 1 → None
pre = 2
cur = 3
第三步:
tmp = None
3 → 2 → 1 → None
cur = None,结束
最终返回 pre
,即新的头节点。
✅ 五、Python 实现代码(迭代)
# Definition for singly-linked list.
class ListNode:def __init__(self, val=0, next=None):self.val = valself.next = nextfrom typing import Optionalclass Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:cur = headpre = Nonewhile cur:tmp = cur.next # 1. 暂存下一个节点cur.next = pre # 2. 当前节点指向前一个pre = cur # 3. pre 向前移动cur = tmp # 4. cur 向前移动return pre
🧯 六、常见错误总结
错误描述 | 原因 |
---|---|
cur.next = cur | 会造成死循环,指针指向自己 |
忘记保存 cur.next | 链表断链,后面访问不到 |
最后返回 cur | cur 最后是 None ,应返回 pre |
🔁 七、递归解法(可选拓展)
虽然迭代更推荐,但你也可以使用递归反转链表:
class Solution:def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:if head is None or head.next is None:return headnew_head = self.reverseList(head.next)head.next.next = headhead.next = Nonereturn new_head
📚 八、总结与面试建议
-
链表题是面试经典,考察指针操作能力。
-
本题是链表反转的基础,后续可拓展到:
- 反转链表前 N 个节点
- 反转部分链表(区间 [m, n])
- k 个一组反转链表
✨ 九、推荐练习题
- 92. 反转链表 II
- 25. K 个一组翻转链表
- 234. 回文链表
📌 如果你觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、评论 💬 支持我!