15

反转链表

·2 分钟

🟢 Easy · 🏷️ 链表 · LeetCode#206

📖 题目

给定单链表头节点 head,反转链表,返回新的头节点。

输入输出
1→2→3→4→5→NULL5→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)。这四步的顺序是链表操作的通用防丢失原则——改指针前,先存下一个,后面的链表题会反复用到。