链表头插函数未按预期工作:指针更新问题排查
问题原因分析
你的代码存在两个核心问题,导致第二次添加头节点后外部无法看到新节点:
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
相关产品推荐
相关产品推荐

