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

双向链表指定元素删除问题求助:无法删除尾节点

双向链表删除尾节点失败的问题修复

你的代码删除尾节点失败的核心问题有两个:

  • 当要删除的是尾节点时,temp->next是NULL,直接访问(temp->next)->prev会触发空指针引用,导致程序崩溃或行为异常
  • 删除尾节点后没有更新*tail指针,会让链表的尾指针指向已释放的无效内存

另外还有个隐藏问题:如果链表只有单个节点(头和尾是同一个),你处理头节点的逻辑也会因为temp->next为NULL触发空指针错误。

下面是修正后的代码,标注了关键修改点:

#include <stdio.h>
#include <stdlib.h>

// 假设你的宏定义如下
#define SUCCESS 1
#define FAILURE 0
#define DATA_NOT_FOUND -1

typedef struct Dlist {
    int data;
    struct Dlist *prev;
    struct Dlist *next;
} Dlist;

int dl_delete_element(Dlist **head, Dlist **tail, int data)
{
    Dlist *temp, *prev_node;
    if (*head == NULL)
        return FAILURE;

    temp = *head;

    // 处理头节点(含链表仅单个节点的情况)
    if (temp->data == data)
    {
        prev_node = *head;
        // 链表只有一个节点时,删除后同时清空头尾指针
        if (*head == *tail)
        {
            *head = NULL;
            *tail = NULL;
        }
        else
        {
            temp->next->prev = NULL;
            *head = temp->next;
        }
        free(prev_node);
        return SUCCESS;
    }

    // 遍历查找匹配节点(包含尾节点)
    while (temp != NULL)
    {
        if (temp->data == data)
        {
            prev_node = temp;
            // 匹配的是尾节点时单独处理
            if (temp == *tail)
            {
                temp->prev->next = NULL;
                *tail = temp->prev;
            }
            else
            {
                // 中间节点的双向指针正常修改
                temp->prev->next = temp->next;
                temp->next->prev = temp->prev;
            }
            free(prev_node);
            return SUCCESS;
        }
        temp = temp->next;
    }

    return DATA_NOT_FOUND;
}

关键修改说明:

  • 处理头节点时,先判断是否为唯一节点,是的话同时清空head和tail,避免空指针访问
  • 遍历到匹配节点时,先判断是否是尾节点:
    • 尾节点无需处理temp->next的指针(因为它是NULL),只需将前驱节点的next置空,再把tail更新为前驱节点
    • 中间节点保持原有的双向指针修改逻辑

修改后,头节点、中间节点、尾节点,以及单节点链表的场景都能正确处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:03:19