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

结构体指针p->next=q与p=q的区别及链表合并代码顺序疑问

问题1:p->next = q与p = q的区别

两者修改的对象完全不同:

  • p = q修改的是指针变量p本身的取值:执行后指针p会和q指向完全相同的内存地址,原有p指向的结构体内容不会发生任何修改,只是p这个指针本身更换了指向的目标。
  • p->next = q修改的是p指向的结构体的成员取值:指针p本身的指向不会变化,只是把p指向的结构体里的next成员的值设置为q的地址,本质是修改了p指向的结构体的内容。

举个直观的例子:假设初始时p指向节点A,q指向节点B:

  • 执行p = q后,p现在指向节点B,节点A没有任何变化
  • 执行p->next = q后,p仍然指向节点A,但是节点A的next成员现在指向节点B
问题2:两种合并链表写法结果不同的原因

核心差异是p = p->next和third->next = NULL的执行顺序不同,导致指针操作的效果完全相反:
首先明确前提:执行third = p之后,third和p会指向同一个结构体节点,对这个节点成员的修改对两个指针同时生效。

第一种可正常运行的写法逻辑

third = p;
last = p;
p = p->next; // 先移动p指针,让p指向原链表的下一个节点,此时p和third已经指向不同的节点
third->next = NULL; // 仅修改摘出来的头节点的next指针为NULL,不会影响原链表剩余节点的关联关系

这个逻辑是正确的:摘出首节点后先移动原链表的遍历指针,再断开摘出节点和原链表的关联,原链表后续的节点仍然可以通过移动后的p正常遍历。

第二种错误写法的逻辑

third = p;
last = p;
third->next = NULL; // 此时third和p还指向同一个节点,相当于直接把当前p指向节点的next成员改成NULL
p = p->next; // 此时p->next已经被置为NULL,所以p会直接赋值为NULL,后续再也无法遍历原链表剩余的节点

该写法先断开了当前节点和原链表后续节点的关联,再移动遍历指针p,直接导致原链表的遍历链路断裂,后续合并逻辑无法拿到剩余的待合并节点,自然无法得到正确结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 18:15:08