链表反转代码疑问:为何用next变量可行,直接用temp->next却失效?
链表反转代码的问题解析
原问题
我正在编写链表反转代码,以下是可正常运行的代码:
Node* reverseLinkedList(Node *head) { Node* temp = head; Node* prev = NULL; while(temp != nullptr) { Node* next = temp->next; temp->next = prev; prev = temp; temp = next; } return prev; }
该代码运行完全正常,但既然next节点就是temp->next,为何我无法使用以下代码:
Node* reverseLinkedList(Node *head) { Node* temp = head; Node* prev = NULL; while(temp != nullptr) { Node* next = temp->next; temp->next = prev; prev = temp; temp = temp->next; } return prev; }
此代码无法正常运行,希望能明确节点的工作原理。
问题原因与节点原理拆解
核心问题
错误代码里,你在修改temp->next指向prev之后,再用temp = temp->next赋值——这时候temp->next已经不是原来的下一个节点了,而是被改成了prev(初始为NULL),直接导致循环提前终止,后续节点全部丢失。
逐步骤对比两种代码(以链表1->2->3->NULL为例)
正常代码执行流程
- 第一次循环:
next保存2(原本的下一个节点)temp(1)->next设为NULL(断开原连接,指向反转后的前节点)prev更新为1temp赋值为next(2),进入下一次循环
- 第二次循环:
next保存3temp(2)->next设为1prev更新为2temp赋值为next(3),继续循环
- 第三次循环:
next保存NULLtemp(3)->next设为2prev更新为3temp赋值为next(NULL),循环结束
- 返回
prev(3),得到反转后的链表3->2->1->NULL
错误代码执行流程
- 第一次循环:
next保存2temp(1)->next设为NULLprev更新为1temp = temp->next也就是NULL,循环直接终止
- 返回
prev(1),仅第一个节点被处理,后续的2、3节点完全丢失,无法完成反转
链表节点的核心工作逻辑
链表的每个节点依靠next指针维持与后续节点的连接,一旦修改next的指向,原有的连接会被立即覆盖。因此,在修改当前节点的next之前,必须先把原本的后续节点地址保存到临时变量(比如正常代码里的next),否则就会失去对后续节点的引用,无法继续遍历和反转整个链表。
内容的提问来源于stack exchange,提问作者hash
相关产品推荐
相关产品推荐

