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

单链表void decimate()方法删除每第10个节点无效问题排查

解决链表decimate()方法无变化的问题

嘿,我来帮你捋捋为啥你的decimate()方法调用后链表没变化——你的代码目前只写了个开头,遗漏了好几个关键的核心逻辑,我给你拆解一下:

  • 没遍历整个链表:你只写了一轮10次的for循环,但要删除每第10个节点,得持续遍历整个链表直到末尾,而不是只走10步就停下。
  • 缺少前节点维护:删除链表节点不能只操作当前节点,必须让它的前一个节点的next指向它的下一个节点,不然链表会直接断开。如果要删除的是头节点,还得单独更新head指针。
  • 计数器逻辑错误:
    • 你从0开始计数,但通常我们会从1开始数,这样数到10时刚好对应目标节点;
    • 删除节点后没重置/调整计数器——删除节点后,后续节点的位置往前挪了一位,下一轮计数得重新从1开始算。
  • 没有实际的删除逻辑:找到第10个节点后,你没写任何删除操作,比如调整指针指向、释放节点内存(如果是C/C++这类手动管理内存的语言),等于根本没改动链表结构。
  • 未处理边界情况:比如链表为空、节点总数不足10个,或者要删除的是尾节点(如果你的链表有tail指针的话),这些情况都得提前判断。

给你一个完整的示例代码(假设是C++单链表,有head指针),你可以参考下:

void decimate() {
    if (head == nullptr) return; // 空链表直接返回

    Node* prev = nullptr;
    Node* temp = head;
    int count = 1; // 从1开始计数,方便定位第10个节点

    while (temp != nullptr) {
        if (count == 10) {
            // 处理删除逻辑
            if (prev == nullptr) {
                // 要删除的是头节点,更新head
                head = temp->next;
            } else {
                // 让前节点跳过当前节点
                prev->next = temp->next;
            }
            // 释放要删除的节点内存
            Node* toDelete = temp;
            temp = temp->next; // 先移动指针再删除,避免悬空
            delete toDelete;
            count = 1; // 重置计数器,重新开始数
        } else {
            // 没到第10个,继续遍历
            prev = temp;
            temp = temp->next;
            count++;
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:35:05