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

基于指针实现链表的问题问询:头指针声明与输出差异原因求解

问题1解答

首先我们先明确两种头的实现差异:

  • 用node *head = nullptr作为起始,本质是无头节点(哑节点)的链表实现:空链表的状态就是头指针指向空,没有任何实际存储数据的节点,逻辑和空链表的语义完全匹配。
  • 如果直接声明node head对象作为起始,属于带头节点的链表实现:哪怕链表没有任何有效数据,也会占用一个节点的内存空间,这个头节点本身不存储业务数据,仅作为占位使用。

至于运行速度,两种实现没有显著差异:
无头节点的实现仅在头尾插入/删除时需要多做一次头指针是否为空的判断,开销可以忽略不计;而带头节点的实现反而不需要处理空链表的特殊分支,代码写起来更简洁,实际运行速度几乎一致。

无头节点链表的运行逻辑非常好理解:
空链表时head == nullptr,代表没有任何节点;新增节点时把新节点的next指向原来的head,再把head指向新节点就完成了头插,遍历的时候只要判断当前指针不是nullptr就继续往下走,到空就停止。


问题2解答

两次输出差异完全来自头指针初始化的区别:

  1. 你用的head1初始化逻辑是node *head1 = nullptr,头指针一开始是空:
    调用addFront之后,新创建的节点value=2,next = nullptr,head1指向这个新节点。showList遍历的时候先输出2,遇到next = nullptr直接停止,所以输出结果只有2。
  2. 而head2初始化是node *head2 = new node:
    这里你先主动创建了一个节点,这个节点会默认用结构体的初始化规则赋值:value=0,next = nullptr。调用addFront之后,新创建的value=2的节点next指向你之前new出来的这个值为0的节点,head2指向新节点。showList遍历的时候先输出2,再往后走找到值为0的节点输出,再遇到next=nullptr停止,所以输出结果是2 0。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:06:03