直接遍历修改指针比递归更稳妥,因递归易栈溢出且C++无尾递归优化保证;迭代用prev、curr、next_temp三指针原地反转,需先暂存next_temp防断链,边界情况自然处理,返回prev为新头。

为什么直接遍历修改指针比递归更稳妥
递归反转链表在理论上简洁,但实际中容易因栈溢出失败——特别是当链表长度超过几千节点时,std::stack 或函数调用栈就可能崩。C++ 没有尾递归优化保证,所以生产代码里优先选迭代。核心思路是:遍历原链表,把每个节点的 next 指针从指向后一个,改为指向前一个。
三指针法的具体步骤和变量含义
用三个指针协作完成原地反转:prev(已反转部分的头)、curr(当前处理节点)、next_temp(暂存下一个待处理节点)。关键在于不能丢掉后续节点的引用。
无序列表说明操作顺序:
- 初始化:
prev = nullptr,curr = head - 循环中先保存:
next_temp = curr->next(否则改完curr->next就找不到后面了) - 翻转当前节点:
curr->next = prev - 推进指针:
prev = curr,curr = next_temp - 循环结束时
prev就是新头节点
边界情况必须手动检查
空链表(head == nullptr)和单节点链表(head->next == nullptr)不会进循环体,但代码本身能自然处理——因为初始 prev 是 nullptr,返回它即正确结果。不需要额外 if 分支,反而加了易出错。
立即学习“C++免费学习笔记(深入)”;
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
常见错误现象:Segmentation fault (core dumped) 多半是忘了保存 next_temp,导致 curr->next = prev 后丢失后续链,下一轮 curr = curr->next 解引用空指针。
反转后原 head 指针是否还能用
能,但它不再是指向链表头部,而是变成了尾节点(head->next 为 nullptr)。如果你在反转后还拿着旧 head 变量去遍历,会只访问到一个节点。必须用反转函数的返回值作为新头指针。
示例片段:
Node* reverseList(Node* head) {
Node* prev = nullptr;
Node* curr = head;
while (curr != nullptr) {
Node* next_temp = curr->next;
curr->next = prev;
prev = curr;
curr = next_temp;
}
return prev; // 注意这里返回的是 prev,不是 head
}真正容易被忽略的点:反转操作不改变节点内容,只改指针;但如果节点里有智能指针(如 std::unique_ptr<Node>),就得用移动语义重写逻辑——那已经不是基础单向链表问题了。

















