You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表反转代码疑问:为何用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为例)

正常代码执行流程

  1. 第一次循环:
    • next保存2(原本的下一个节点)
    • temp(1)->next设为NULL(断开原连接,指向反转后的前节点)
    • prev更新为1
    • temp赋值为next(2),进入下一次循环
  2. 第二次循环:
    • next保存3
    • temp(2)->next设为1
    • prev更新为2
    • temp赋值为next(3),继续循环
  3. 第三次循环:
    • next保存NULL
    • temp(3)->next设为2
    • prev更新为3
    • temp赋值为next(NULL),循环结束
  4. 返回prev(3),得到反转后的链表3->2->1->NULL

错误代码执行流程

  1. 第一次循环:
    • next保存2
    • temp(1)->next设为NULL
    • prev更新为1
    • temp = temp->next也就是NULL,循环直接终止
  2. 返回prev(1),仅第一个节点被处理,后续的2、3节点完全丢失,无法完成反转

链表节点的核心工作逻辑

链表的每个节点依靠next指针维持与后续节点的连接,一旦修改next的指向,原有的连接会被立即覆盖。因此,在修改当前节点的next之前,必须先把原本的后续节点地址保存到临时变量(比如正常代码里的next),否则就会失去对后续节点的引用,无法继续遍历和反转整个链表。


内容的提问来源于stack exchange,提问作者hash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:46:19