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

链表尾插节点代码问题排查:无报错但功能不符合预期

问题分析与修复方案

我一眼就瞅出问题啦——你的attachEnd函数不小心修改了原本的链表头指针,这就是节点没按预期工作的核心原因!

问题出在哪?

看这段代码:

else {
    while ((*hptr)->next != NULL) {
        (*hptr) = (*hptr)->next;
    }
    (*hptr)->next = newnode;
}

这里你直接操作了传入的*hptr(也就是主函数里的head指针的引用),在while循环里把它一步步移到了链表尾部。循环结束后,原来的head指针已经不再指向链表的头部,而是变成了最后一个节点!

这样一来,下次你再调用attachEnd或者尝试遍历链表时,都会从这个“新的head”(实际是原尾部)开始操作,自然看不到之前的节点,看起来就像新节点没被正确添加一样。

修复后的代码

解决方法很简单:用一个临时指针来遍历链表,不要直接修改传入的头指针引用。修改后的函数如下:

void attachEnd(node **hptr, node *newnode) {
    // 确保新节点的next为空,避免野指针
    newnode->next = NULL;
    
    if (*hptr == NULL) {
        *hptr = newnode;
    } else {
        // 用临时指针current遍历,不修改原头指针
        node *current = *hptr;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newnode;
    }
}

关键改动说明

  • 新增了newnode->next = NULL:确保新节点的尾部是正确终止的,避免出现循环链表或者野指针问题(即使你说newnode已初始化,加这一步更稳妥)。
  • 使用临时指针current代替直接操作*hptr:遍历过程中只会移动current,原头指针*hptr(也就是主函数里的head)始终指向链表头部,后续操作链表就正常了。

这样修改后,再调用attachEnd(&head, newnode),新节点就会被正确添加到链表尾部,同时表头指针也能保持正确啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:45:46