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

链表头插函数未按预期工作:指针更新问题排查

问题原因分析

你的代码存在两个核心问题,导致第二次添加头节点后外部无法看到新节点:

1. 没搞懂C语言指针传递的本质

C语言函数参数是值传递,你传入的head是一个指针变量,函数里的obj只是它的一份拷贝。第二次调用函数时,你创建了新节点new并让new->next = obj(指向原来的head节点),但这个操作完全没改变外部的head变量——外部的head仍然指向那个值为1的节点,新节点根本没被外部指针引用,自然输出时看不到它。

2. 空链表的判断逻辑错误

你用obj->n == 0判断链表为空,这个逻辑不成立:如果链表中存在值为0的有效节点,代码会误把它当成空链表处理;而且这种判断方式本身就不符合链表的设计规范——空链表的标准判断应该是头指针为NULL,而非节点的值。

修正方案

方案一:使用双指针(直接修改外部头指针)

把函数参数改成指向指针的指针,这样就能在函数内部修改外部的head变量:

void myLinkedListAddAtHead(MyLinkedList** obj, int val)
{
    // 创建新节点
    MyLinkedList *new_node = malloc(sizeof(MyLinkedList));
    if (new_node == NULL)
        return;
    new_node->n = val;
    // 新节点的next指向原来的头节点
    new_node->next = *obj;
    // 更新外部的头指针,让它指向新节点
    *obj = new_node;
}

调用时传入head的地址:

// 初始化时head为NULL,表示空链表
MyLinkedList* head = NULL;
myLinkedListAddAtHead(&head, 1);
myLinkedListAddAtHead(&head, 2);

方案二:返回新的头节点

如果不想用双指针,可以让函数返回新的头节点,外部用返回值更新head:

MyLinkedList* myLinkedListAddAtHead(MyLinkedList* obj, int val)
{
    MyLinkedList *new_node = malloc(sizeof(MyLinkedList));
    if (new_node == NULL)
        return obj;
    new_node->n = val;
    new_node->next = obj;
    // 返回新的头节点
    return new_node;
}

调用方式:

MyLinkedList* head = NULL;
head = myLinkedListAddAtHead(head, 1);
head = myLinkedListAddAtHead(head, 2);
额外提醒
  • 永远不要用节点的值判断链表是否为空,空链表的标志是头指针为NULL。
  • 记得在链表销毁时释放所有malloc分配的节点,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Leuel Asfaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:45:40