反转单向链表的核心逻辑是逐个改变每个节点的next指针指向,需用prev、curr、next三个指针协作:prev记录前驱,curr遍历当前节点,next暂存原后继,防止断链;空链表和单节点无需特殊处理,迭代法更优且满足仅调指针的要求。

反转单向链表的核心逻辑是什么
关键不是“翻转节点”,而是逐个改变每个节点的 next 指针指向——让原来指向后继的指针,全部改指向前驱。这必须用三个指针协作完成:一个遍历(curr),一个记住前一个节点(prev),一个提前保存下一个节点(next),否则一改 curr->next 就会丢掉后续链。
为什么不能只用两个指针就地反转
常见错误是只用 prev 和 curr,在循环里写成:curr->next = prev; curr = curr->next;。这会导致 curr 立刻变成 nullptr(因为刚把 next 设为 prev),后续节点彻底丢失。
- 必须在修改
curr->next之前,用临时变量存下原curr->next -
prev初始为nullptr,对应新链表尾部的空指针 - 反转完成后,
prev自然成为新头节点,返回它即可
迭代实现的完整代码片段(带注释)
struct ListNode {
int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
};
<p>ListNode<em> reverseList(ListNode</em> head) {
ListNode<em> prev = nullptr;
ListNode</em> curr = head;
while (curr != nullptr) {
ListNode* next = curr->next; // 先保活后续
curr->next = prev; // 指针掉头
prev = curr; // 前驱前移
curr = next; // 当前前移
}
return prev; // 此时 prev 是原尾节点,即新头
}面试中容易被追问的细节点
考官常卡在边界和鲁棒性上:
- 空链表(
head == nullptr)和单节点链表能直接过,无需特殊处理 - 不要在循环里写
curr = curr->next后再取curr->next,这是空指针解引用高发区 - 递归写法虽然简洁,但深度过大时可能栈溢出;迭代更符合“高性能链表操作”的考察意图
- 如果题目要求“不改变节点值,仅调整指针”,这个迭代解法完全满足;若允许新建节点,则属于另一类题(如复制+反转),别混淆
真正难的不是写对三行指针赋值,而是说清每一步指针状态变化——比如画图演示第二轮迭代后 prev、curr、next 分别指向哪,很多人在这里卡住。
立即学习“C++免费学习笔记(深入)”;











