不能直接交换节点的val字段,因为单链表反转的本质是重连next指针而非修改值;需用prev、curr、next三指针配合,先保存next再反向连接最后推进,且必须处理空链表和单节点边界;迭代法优于递归,因其时间O(n)、空间O(1)、无栈溢出风险。

为什么不能直接交换节点的 val 字段?
很多人初学时想用“冒泡式交换值”来模拟反转,比如遍历一遍把首尾 val 互换。这根本没动指针结构,next 关系完全没变——外部调用者看到的还是原顺序,只是数据被搅乱了。单链表反转的本质是重连 next 指针,不是改值。
prev、curr、next 三指针怎么配合才不丢节点?
核心陷阱是:一旦执行 curr->next = prev,就断开了往后走的路。所以必须在修改前,用临时变量存住下一个节点地址。标准三步不可颠倒:
- 先用
next = curr->next保活后续链 - 再执行
curr->next = prev完成当前节点的反向连接 - 最后推进:把
prev和curr都往前挪一位(prev = curr; curr = next;)
起始时 prev = nullptr,结束时 curr 为 nullptr,此时 prev 就是新头节点。
C++ 实现里要不要考虑空链表和单节点?
要,而且必须显式处理。空链表(head == nullptr)或单节点(head->next == nullptr)时,循环体一次都不进,直接返回 head 即可。漏掉这个判断,代码看似能跑,但遇到边界输入就会行为异常或崩溃。
一个简洁写法是直接把循环条件设为 while (curr != nullptr),天然兼容所有情况,无需额外 if 分支。
迭代比递归更推荐,但递归错在哪?
递归写法容易写成“先反转后面,再把原头节点接到尾部”,看似合理,但实际要遍历到尾才能接,时间复杂度变成 O(n²);或者用辅助函数传入 prev,又容易混淆参数生命周期。而迭代版只扫一遍、空间 O(1),逻辑清晰、无栈溢出风险。
真正要注意的是:C++ 中若节点是手动 new 出来的,反转本身不涉及内存释放,但调用方必须确保原头指针不再被误用——反转后旧 head 已不是头,继续用它遍历会出错。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











