← 链表 · Linked List / 反转链表:迭代与递归 待审核 2 / 14
reverse · 迭代 / 递归

反转链表:迭代与递归

「反转单链表」是链表的经典题目。难点不在思路而在不要丢失链表的后段——把 cur.next 改写为指向前一个节点后,原来的后续节点就再也无法到达。所以经典写法有一个固定顺序:先用一个临时指针 tmp 把后继存下来,再改写指向。下面对比迭代(三指针 prev / cur / tmp)递归(先反转后段,再回指自己) 两种写法的执行过程。

**为什么必须「先存 tmp 再改写指向」?**四步的顺序是固定的:tmp = cur.next(暂存后继)→ cur.next = prev(反向)→ prev = cur(prev 跟上)→ cur = tmp(cur 跟上)。如果省掉第一步直接 cur.next = prev,下一句 cur = cur.next 就把 cur 送回了 prev,后面整段丢失。这是链表所有「边遍历边改指针」问题的通用规则。

递归版在「回溯」阶段做事(递归写法):一路 reverse(head.next) 递归到尾节点(base case,它就是新表头),然后在回溯时每层做两件事:head.next.next = head(让后继回头指向自己)、head.next = null(自己先断开,若自己是原表头,这就成了新的尾)。栈深 O(n)O(n) 是它和迭代版 O(1)O(1) 空间的唯一差别。