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

C语言链表尾节点删除函数错误求助:求正确实现方案

解决链表尾节点删除的C语言实现问题

我来帮你搞定这个链表尾节点删除的问题!先拆解你之前两段代码的错误,再给你实现完全符合你思路的正确代码。

先分析你两段代码的问题

第一段代码的错误

struct node *del_the_last(struct node *head) { 
    struct node *h1 = head; 
    if (head == NULL) { return NULL; } 
    while (head->next != NULL) { head = head->next; } 
    free(h1); 
    return head; 
}

这段代码的核心问题有两个:

  1. 你释放的是原头节点(h1保存的是初始head),而不是尾节点,这会导致整个链表的头被销毁,剩下的节点都变成野指针;
  2. 你没有修改倒数第二个节点的next指针,就算遍历到了尾节点,也没法把它从链表中移除。
    测试返回[12]只是因为最后head指向了原尾节点,但此时前面的所有节点都已经被释放,这个结果是完全错误的。

第二段代码的错误

struct node *del_the_last(struct node *head) { 
    struct node *h1 = head; 
    int flag = 1; 
    if (head == NULL) { return NULL; } 
    while (flag == 1) { 
        if (head->next->next == NULL) { 
            flag = 0; 
            head->next = NULL; 
            free(h1); 
            return head; 
        } else { 
            head = head->next; 
        } 
    } 
}

这段代码的问题:

  1. 同样错误地释放了原头节点(h1),导致整个链表的头被销毁;
  2. 最后返回的是head,而此时head已经移动到了倒数第二个节点,所以测试返回1(原链表的倒数第二个值),不符合返回原头指针的预期;
  3. 没有释放原尾节点,造成内存泄漏。

符合你思路的正确实现

你的思路完全正确,核心就是要保留原头指针,操作完成后返回它。下面是具体的C代码实现(假设你的节点结构定义如下):

首先,节点结构定义:

struct node {
    int data;
    struct node *next;
};

删除尾节点的函数:

struct node *del_the_last(struct node *head) {
    // 步骤1:保存原始头指针到变量
    struct node *original_head = head;

    // 空链表直接返回NULL
    if (head == NULL) {
        return NULL;
    }

    // 链表只有一个节点的情况:释放该节点,返回NULL
    if (head->next == NULL) {
        free(head);
        return NULL;
    }

    // 步骤2:正常执行逻辑——找到倒数第二个节点
    while (head->next->next != NULL) {
        head = head->next;
    }

    // 此时head是倒数第二个节点,head->next就是要删除的尾节点
    struct node *tail_node = head->next;
    // 断开尾节点与链表的连接
    head->next = NULL;
    // 步骤4:释放尾节点
    free(tail_node);

    // 步骤3:将head重新赋值为原始头指针
    head = original_head;
    // 步骤5:返回原始头指针
    return head;
}

代码逻辑说明

  1. 保存原头指针:用original_head存储初始的head,确保最后能返回正确的链表头;
  2. 边界情况处理:空链表直接返回;单个节点时释放后返回NULL;
  3. 找到倒数第二个节点:通过head->next->next != NULL的条件遍历,避免直接走到尾节点后无法回溯;
  4. 删除尾节点:断开连接后释放尾节点,避免内存泄漏;
  5. 返回原头指针:最后把head重置为original_head,返回正确的链表头。

用你的测试用例验证:

  • 输入16,7,8,12,13,19,21,12:删除尾节点12后,返回原头指针,链表变为16,7,8,12,13,19,21;
  • 输入2,7,1,8:删除尾节点8后,返回原头指针,链表变为2,7,1,完全符合预期。

内容的提问来源于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 07:06:05