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

环形链表按Key删除节点函数失效问题排查

环形链表删除节点函数的错误分析

你的deletenode函数存在两个核心问题,导致删除操作未生效:

1. 删除节点后未更新遍历指针,循环逻辑混乱

当找到匹配key的节点时,你完成了prev->next = p->next和delete(temp)操作,但没有更新p的指向,也没有跳过else分支的指针移动逻辑。此时p仍然指向已经被释放的内存地址,后续循环会出现指针异常,甚至让已删除节点的“痕迹”留在遍历流程中,导致看起来删除未生效。

正确的处理是:删除节点后,将p更新为prev->next(原节点的下一个节点),无需移动prev,直接进入下一次循环即可。

2. 未处理删除尾节点(last)的情况

环形链表中last是尾节点,其next指向头节点。如果要删除的节点恰好是last,你必须将last更新为prev(新的尾节点),否则last会指向已被删除的节点,后续遍历链表时会出现逻辑错误,导致目标节点看起来没被删除。

修正后的代码示例

void deletenode(string key) {
    if (last == NULL) {
        cout << "your circular linked list is an empty one" << endl;
        return;
    }

    node* p = last->next;
    node* prev = last;

    do {
        if (p->title == key) {
            node* temp = p;
            prev->next = p->next;
            // 若删除的是尾节点,更新last指针
            if (p == last) {
                last = prev;
            }
            delete(temp);
            // 更新p到下一个节点,继续遍历
            p = prev->next;
        } else {
            p = p->next;
            prev = prev->next;
        }
    } while (p != last->next);
}

额外说明

如果需求是只删除第一个匹配的节点,删除完成后可以直接break跳出循环,避免不必要的遍历;如果需要删除所有匹配节点,保持循环继续即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:15:53