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

C语言LeetCode单链表题适配给定原型实现头插节点的方法

单链表头插实现适配题目接口的问题

我在跟着LeetCode单链表章节的指引用C语言从零实现单链表结构,当前推进到「在链表头部新增节点」的实现环节,遇到了实现逻辑和题目接口规范不匹配的问题。

题目给定的接口调用规范

题目明确说明,最终的接口会按照以下规则被调用:

/**
 * Your MyLinkedList struct will be instantiated and called as such:
 * MyLinkedList* obj = myLinkedListCreate();
 * myLinkedListAddAtHead(obj, val);
 **/

之前尝试的实现方案与存在的问题

第一版:二级指针实现头插

我最开始预想的主函数调用逻辑是这样的(暂时不考虑内存泄漏问题):

int main(void)
{
    MyLinkedList *head;
    head = myLinkedListCreate();
    myLinkedListAddAtHead(&head, 10);
    myLinkedListAddAtHead(&head, 9);
    myLinkedListAddAtHead(&head, 8);
    return (0);
}

按照这个逻辑写的实现代码存在两个核心问题:

  • 链表创建函数逻辑写反:malloc申请到有效内存后直接把指针置为NULL,完全浪费了申请的内存空间
  • 头插函数的入参用了二级指针MyLinkedList **obj,和题目要求的单级指针对不上

对应的问题代码片段:

#include <stddef.h>
#include <stdlib.h>

typedef struct MyLinkedList_s
{
    int data;
    struct MyLinkedList_s *next;
} MyLinkedList;

MyLinkedList* create() 
{
    MyLinkedList *node;
    node = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    if (!node)
        return (NULL);
    node = NULL; // 错误逻辑:申请到的有效内存被直接置空
    return (node);
}

void myLinkedListAddAtHead(MyLinkedList **obj, int val) 
{
    MyLinkedList *tmp;
    tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    if (!tmp)
        return ;
    tmp->data = val;
    tmp->next = *obj;
    *obj = tmp;
}

第二版:返回值带回新头指针

为了适配单级指针的入参要求,我尝试把头插函数的返回值改成链表指针类型,靠返回值把新的头节点回传出去:

MyLinkedList *myLinkedListAddAtHead(MyLinkedList *obj, int val) 
{
    MyLinkedList *tmp;
    tmp = (MyLinkedList *)malloc(sizeof(MyLinkedList));
    if (!tmp)
        return ;
    tmp->data = val;
    tmp->next = obj;
    obj = tmp;
    return (obj);
}

对应的主函数需要每次接收返回的新头指针才能正常工作:

int main(void)
{
    MyLinkedList *head;
    head = create();
    head = myLinkedListAddAtHead(head, 10);
    head = myLinkedListAddAtHead(head, 9);
    head = myLinkedListAddAtHead(head, 8);
    return (0);
}

但这个方案依然不满足题目要求:题目明确要求头插函数的返回值是void,不允许靠返回值传递新的头节点。

核心疑问

已知测试侧的主函数只会按照以下逻辑创建链表实例,之后直接调用头插接口,不会做传指针地址、接收函数返回值这类操作:

int main(void)
{
    MyLinkedList *head;
    head = create();
    return (0);
}

要怎么在严格遵守题目给定的void myLinkedListAddAtHead(MyLinkedList* obj, int val)函数原型的前提下,完成链表头部新增节点的功能?


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 15:15:09