单向链表反转核心是翻转next指针方向:迭代法用prev、curr、nexttemp三指针按“存后续→翻指针→挪位置”顺序原地翻转;递归法先递归至尾部获newhead,再通过head->next->next=head和head->next=null回溯连接,返回newhead。

单向链表反转的核心不在于移动节点数据,而在于翻转每个节点的 next 指针方向。关键在理清变量职责和时序——迭代靠三个指针协同推进,递归靠子问题返回后“回填”连接关系。
迭代法:三变量各司其职,边走边翻
用 prev、curr、nextTemp 三个变量配合完成原地翻转:
-
prev:始终指向已处理部分的新“头侧”,初始为
null(因为反转后原头节点要变成尾节点,其 next 应为 null) - curr:当前正在处理的节点,从原 head 开始,每轮处理完就前进一步
-
nextTemp:仅作临时中转,每次循环开头就保存
curr.next,防止修改 curr.next 后断链失联
每轮操作顺序固定:先存后续 → 再翻指针 → 最后挪位置。循环结束时 curr 为 null,prev 正好停在原链表末尾,即新链表的头节点。
递归法:信任子问题,回溯时接续
递归不逐个操作节点,而是把问题拆成“反转 head->next 之后的部分”,再把 head 挂到结果尾部:
- 基础情况:
head == null或head.next == null,直接返回 head(空链或单节点无需反转) - 递归调用:
newHead = reverseList(head.next),这一步会一路深入到底,拿到反转后子链的头节点 - 回溯连接:
head.next.next = head让子链尾指向当前 head;head.next = null切断原向后连接,避免成环
最终返回的是最深层递归得到的 newHead,它始终是原链表最后一个节点,也就是反转后的真正头节点。
常见逻辑陷阱与规避要点
两类解法都容易在细节上出错,重点注意:
- 迭代中未提前保存
curr.next就赋值curr.next = prev,导致后续整段链表丢失 - 迭代返回了
curr(循环结束为 null)而非prev,结果为空指针 - 递归忘记置空
head.next,反转后形成环(如 1→2→1) - 递归误将
head.next.next = head写成head.next = head,逻辑完全错误
迭代空间效率高、逻辑线性,适合工程落地;递归代码简洁但依赖调用栈,适合理解链表结构本质。两者变量设计背后,都是对“链式依赖”这一特性的精准应对。










