反转单向链表的核心逻辑是逐个改变节点next指针指向,关键在于遍历中用临时变量安全保存下一节点地址,避免链表断裂;迭代需prev、current、nextnode三指针按序操作,递归则依赖返回新头并正确断开原连接。

反转单向链表的核心逻辑是什么
单向链表反转的本质是逐个改变每个节点的 next 指针指向,让原本指向后继的指针全部反向,最终原尾节点变成头节点。关键不在于移动节点,而在于在遍历过程中**安全保存下一个待处理节点的地址**,否则链表会断裂。
常见错误是先改 current->next = prev,再写 current = current->next —— 此时 current->next 已被覆盖,原始后继丢失。必须用临时变量(如 nextNode)提前保存。
迭代法实现:三指针缺一不可
标准迭代解法依赖三个指针协同工作:prev(已反转部分的头)、current(当前待处理节点)、nextNode(暂存下一节点)。顺序不能乱:
- 先用
nextNode = current->next保存后续链接 - 再执行
current->next = prev完成当前节点反转 - 最后推进:
prev = current,current = nextNode
循环终止条件是 current == nullptr;此时 prev 恰好指向新链表头节点。注意初始状态:prev 必须为 nullptr,否则首节点会指向野地址。
立即学习“C++免费学习笔记(深入)”;
递归法实现:理解“返回值即新头”的含义
递归写法简洁但容易误解。函数返回的是**已反转完成的子链表的新头节点**,而非原头。核心步骤只有三行:
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) return head;
ListNode* newHead = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return newHead;
}重点在第二步:head->next->next = head 是把原后继的 next 指回当前节点,实现局部翻转;第三步 head->next = nullptr 则断开原连接,避免成环。若漏掉这句,原头节点仍连着原第二个节点,会导致环或内存错误。
边界与性能注意事项
两种方法时间复杂度都是 O(n),但空间有差异:迭代法仅用常数额外空间;递归法隐式调用栈深度为 n,对超长链表可能栈溢出。
务必测试以下边界情况:
- 空链表(
head == nullptr)→ 直接返回 - 单节点链表 → 不应崩溃或修改指针
- 含重复值或自环链表 → 反转本身不依赖值,但若误判终止条件可能死循环
真实项目中优先选迭代——它可控、无栈风险、调试直观。递归更适合理解“子问题分解”思想,但上线代码里要警惕隐式开销。










