链表扩展疑问:为何`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成员来建立新的链接:
head->next = new node:直接修改当前head指向节点的next成员,让它指向新创建的节点,这一步完成了新节点和原链表的链接,真正扩展了链表。head = head->next:这只是将head指针移动到新节点上,方便后续继续添加节点,这个操作不会改变已经建立好的链表结构,只是调整了操作指针的位置。
简单来说:head是一个工具指针,修改它的指向只会改变这个工具的位置;而head->next是链表节点的一部分,修改它才会真正改变链表的结构。
内容的提问来源于stack exchange,提问作者Ajay A
相关产品推荐
相关产品推荐

