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

链表扩展疑问:为何`head->next`添加节点可行,修改head不行?

单链表扩展的指针困惑:两种添加节点方式的差异解析

在单链表扩展场景中,常会遇到这样的疑问:为何将新节点添加至head->next可成功扩展链表,但先执行head = head->next再创建新节点的方式无法将节点加入链表?

示例代码

#include<iostream>

struct node {
  int    data;
  node*  next;
};

int main() {
  node *head, *head1;
  head = new node;
  head1 = head; // 用head1保存链表头,最后用于遍历打印

  head->data =  2;

  // 下述代码无法将新节点加入链表
  /* head = head->next;
  head = new node;
  head -> data = 20;*/

  // 下述方法可行,最终能打印完整链表
  head->next = new node; 
  head = head->next; 
  head->data = 20;
  
  while (head1 != nullptr) {
    std::cout<<head1->data<<std::endl;
    head1 = head1->next;
  }
}

错误代码的问题分析

被注释的代码逻辑完全错误,核心原因是混淆了指针变量赋值和链表节点成员赋值的区别:

  • 初始状态下,head指向第一个节点,但这个节点的next成员是未初始化的野指针(随机内存地址)。
  • 执行head = head->next后,head变量存储的地址变成了这个无效的野指针,此时head已经和原链表的第一个节点彻底断开了联系。
  • 后续head = new node只是让head指向了一个全新的孤立节点,这个节点和原链表没有任何链接关系,自然不会被加入到链表中。

正确代码的逻辑解析

可行的代码逻辑抓住了链表扩展的核心:必须修改原链表节点的next成员来建立新的链接:

  1. head->next = new node:直接修改当前head指向节点的next成员,让它指向新创建的节点,这一步完成了新节点和原链表的链接,真正扩展了链表。
  2. head = head->next:这只是将head指针移动到新节点上,方便后续继续添加节点,这个操作不会改变已经建立好的链表结构,只是调整了操作指针的位置。

简单来说:head是一个工具指针,修改它的指向只会改变这个工具的位置;而head->next是链表节点的一部分,修改它才会真正改变链表的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 22:47:39