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

通过函数修改链表:删除首节点的函数实现正确性咨询

分析你的链表首节点删除函数

首先直接给结论:你的实现不正确,主要存在三个关键问题,我来一一拆解并给出正确的写法:

存在的问题

  • 返回值错误:你的函数最后返回NULL,但调用方需要拿到删除首节点后的新链表头(也就是原head->next)。返回NULL会导致调用方丢失整个链表的引用,哪怕原链表有多个节点也会失效。
  • 内存泄漏:你用temp指向了原首节点,但没有释放这块内存(如果节点是用malloc动态分配的)。长期运行会导致内存资源被占用无法回收。
  • 未处理空链表情况:如果传入的head是NULL(空链表),执行head = head->next会触发空指针解引用,直接导致程序崩溃。

修正后的实现

#include <stdlib.h> // 用于free函数

struct node *del_the_first(struct node *head) {
    // 处理空链表,直接返回原head(也就是NULL)
    if (head == NULL) {
        return head;
    }
    
    struct node *temp = head;       // 保存原首节点的地址
    head = head->next;              // 更新head为新的首节点
    free(temp);                     // 释放原首节点的内存,避免泄漏
    return head;                    // 返回更新后的链表头
}

补充说明

  • 如果你的节点不是动态分配的(比如在栈上创建的),可以去掉free(temp)这一行,但这种场景在链表实现里比较少见,通常链表节点都是动态分配的。
  • 调用这个函数时,需要用返回值更新原来的头指针,比如:head = del_the_first(head);,这样才能正确维护链表的引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:51:34