递归创建C语言链表丢失中间节点原因咨询
递归创建链表丢失中间节点的原因分析
你的递归create函数逻辑存在核心错误,每次添加新节点时都会覆盖当前链表头部的next指针,导致之前的中间节点被彻底丢弃,具体拆解如下:
问题重现(以输入3个节点1、2、3为例)
- 第一次调用
create(&head,1):head初始为NULL,创建节点1,head指向节点1,链表为1 -> NULL。 - 第二次调用
create(&head,2):*head是节点1(非空),创建临时变量new=NULL,递归调用create(&new,2)创建节点2,随后将节点1的next指向节点2,链表变为1->2->NULL,这一步暂时正常。 - 第三次调用
create(&head,3):*head仍是节点1(非空),再次创建new=NULL,递归创建节点3,然后执行(*head)->next = new——这直接把节点1的next从节点2改成了节点3,节点2被彻底从链表中断开,最终链表变成1->3->NULL,节点2丢失。
递归思路的错误本质
你设计的递归逻辑没有沿着链表向下遍历找到尾节点,而是每次都在当前头部节点的next位置“强行覆盖”新节点。正确的递归创建逻辑应该是:当当前节点非空时,递归处理当前节点的next指针,把新节点添加到链表的尾部,而不是头部的下一个位置。
比如修正后的非空分支应该是:
(*head)->next = create(&((*head)->next), data); return *head;
这样每次递归都会走到链表的最后一个节点,在其next位置添加新节点,不会覆盖之前的节点链。
内容的提问来源于stack exchange,提问作者noname delete
相关产品推荐
相关产品推荐

