第 15 章
反转链表
·约 2 分钟
🟢 Easy · 🏷️ 链表 · LeetCode#206
📖 题目
给定单链表头节点 head,反转链表,返回新的头节点。
| 输入 | 输出 |
|---|---|
1→2→3→4→5→NULL | 5→4→3→2→1→NULL |
💡 思路
用三个指针原地"掰箭头":prev 指向已经反转好的部分,cur 是当前处理的节点,把 cur.next 从指向后面改成指向 prev,然后两个指针一起往前挪。
关键是顺序:改 cur.next 之前必须先把原来的下一个节点存起来(next_temp = cur.next),不然改完就找不到后面的链表了。
💻 代码
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
prev = None
cur = head
while cur:
next_temp = cur.next # 1. 先存住下一个
cur.next = prev # 2. 箭头反转
prev = cur # 3. prev 前进
cur = next_temp # 4. cur 前进
return prev
时间复杂度 O(n),空间复杂度 O(1)。这四步的顺序是链表操作的通用防丢失原则——改指针前,先存下一个,后面的链表题会反复用到。