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

循环双链表删除节点的removeAt函数未通过测试,遗漏了哪些条件?

循环双链表按位置删除函数问题修复

存在的问题

  • 不必要的内存分配导致内存泄漏:开头声明temp和x指针时调用的malloc完全多余,后续代码直接覆盖了这两个指针的指向,申请的内存再也无法释放,且申请时的大小参数错误,应该是sizeof(struct Node)而非指针大小。
  • 缺少入参合法性校验:没有判断pos是否小于1、或者大于链表总长度,非法pos会直接导致空指针访问、野指针等崩溃问题。
  • 尾节点删除后未更新全局tail指针:当删除的节点是尾节点时,只修改了前驱节点的next指向头节点,没有将tail更新为前驱节点,导致tail指向已被释放的内存,后续操作会出错。
  • 循环逻辑存在越界风险:如果传入的pos超过链表实际长度,循环会遍历到空指针后继续访问next成员,直接触发崩溃。

修复后的代码

void removeAt (int pos)
{
    // 非法位置或者空链表直接返回,可按需求调整错误处理逻辑
    if (pos < 1 || head == NULL) {
        return;
    }
    struct Node *temp = NULL;
    struct Node *x = NULL;

    if(pos == 1)
    {
        temp = head;
        if(head == tail)
        { 
            head = tail = NULL; 
        }
        else
        {
            head = head->next;
            head->prev = tail;
            tail->next = head;
        }
        free(temp);
        return;
    }

    // 遍历找第pos个节点,适配pos>=2的情况
    temp = head;
    for(int i = 1; i < pos; i++)
    { 
        x = temp;
        temp = temp->next;
        // 循环链表回到头节点说明pos超过链表长度,直接返回
        if (temp == head) {
            return;
        }
    }

    x->next = temp->next;
    if(temp == tail)
    {
        tail = x; // 删除尾节点必须更新tail指针
        x->next = head;
    }
    else
    {
        temp->next->prev = x; 
    }
    free(temp);
}

验证测试场景

可优先测试以下场景确认修复效果:

  • 删除非头尾的中间节点
  • 删除尾节点后再次执行新增/删除操作
  • 传入大于链表长度的pos值
  • 链表只剩1个节点时执行删除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:45:04