基于指针实现链表的问题问询:头指针声明与输出差异原因求解
问题1解答
首先我们先明确两种头的实现差异:
- 用
node *head = nullptr作为起始,本质是无头节点(哑节点)的链表实现:空链表的状态就是头指针指向空,没有任何实际存储数据的节点,逻辑和空链表的语义完全匹配。 - 如果直接声明
node head对象作为起始,属于带头节点的链表实现:哪怕链表没有任何有效数据,也会占用一个节点的内存空间,这个头节点本身不存储业务数据,仅作为占位使用。
至于运行速度,两种实现没有显著差异:
无头节点的实现仅在头尾插入/删除时需要多做一次头指针是否为空的判断,开销可以忽略不计;而带头节点的实现反而不需要处理空链表的特殊分支,代码写起来更简洁,实际运行速度几乎一致。
无头节点链表的运行逻辑非常好理解:
空链表时head == nullptr,代表没有任何节点;新增节点时把新节点的next指向原来的head,再把head指向新节点就完成了头插,遍历的时候只要判断当前指针不是nullptr就继续往下走,到空就停止。
问题2解答
两次输出差异完全来自头指针初始化的区别:
- 你用的
head1初始化逻辑是node *head1 = nullptr,头指针一开始是空:
调用addFront之后,新创建的节点value=2,next = nullptr,head1指向这个新节点。showList遍历的时候先输出2,遇到next = nullptr直接停止,所以输出结果只有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
相关产品推荐
相关产品推荐

