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

链表指定元素第k次出现后删除算法异常求助:误删全部实例

修复链表删除指定元素第k次出现后实例的算法

我来帮你搞定这个问题!你的需求是保留指定元素的前k次出现,删除第k次之后的所有该元素实例,但目前的代码会把所有该元素都删掉,咱们先拆解原代码的问题,再给出修复后的方案。

原代码的问题分析

咱们先看看原代码里导致错误的几个关键点:

  • stop变量的逻辑混乱:初始设为true,仅在遇到非目标元素时设为false,这会让头节点的处理逻辑和后续节点割裂,导致指针移动异常。
  • 头节点处理逻辑错误:当i<k时没有移动head指针,会陷入死循环;同时new_head的更新也不正确。
  • 计数逻辑不严谨:i的递增和指针移动没有同步,导致无法准确判断当前是第几次遇到目标元素。

修复后的算法思路

我们换一种更清晰的实现方式:

  1. 使用**哑节点(dummy node)**简化头节点的删除操作,不用单独处理头节点的特殊情况。
  2. 维护一个计数器,遍历链表时,每遇到一次目标元素就递增计数器。
  3. 当计数器超过k时,遇到目标元素就执行删除操作;否则正常遍历。
  4. 全程保持指针的正确移动,避免内存泄漏和空指针异常。

修复后的代码

#include <stdbool.h>
#include <stdlib.h>

typedef struct list { 
    int data; 
    struct list *next; 
} list;

list *delete_after_kth_occurrence(list *head, int element, int k) {
    // 创建哑节点,简化头节点删除逻辑
    list *dummy = (list*)malloc(sizeof(list));
    dummy->next = head;
    list *current = dummy;
    int count = 0;

    while (current->next != NULL) {
        if (current->next->data == element) {
            count++;
            // 当计数超过k时,删除当前节点的下一个节点
            if (count > k) {
                list *temp = current->next;
                current->next = current->next->next;
                free(temp);
                // 注意:这里不移动current,因为删除后current的next已经更新,需要重新检查新的next
                continue;
            }
        }
        // 正常移动指针(未删除节点时)
        current = current->next;
    }

    // 保存新的头节点,释放哑节点
    list *new_head = dummy->next;
    free(dummy);
    return new_head;
}

代码说明

  • 哑节点的作用:哑节点指向原链表的头节点,这样即使头节点是要删除的元素,我们也可以通过操作哑节点的next来处理,不用单独判断头节点的情况,代码更简洁。
  • 计数逻辑:每次遇到目标元素时计数器加1,当计数器大于k时,就删除当前节点的下一个节点(因为我们用current指向要删除节点的前一个节点,方便修改指针)。
  • 指针移动:删除节点后,不移动current,因为删除后current的next已经变成了原来的next->next,需要重新检查这个新的节点是否是目标元素;未删除节点时,正常移动current到下一个节点。
  • 内存管理:最后释放哑节点,避免内存泄漏,返回新的头节点。

测试示例(参考)

比如原链表是 1 -> 2 -> 2 -> 3 -> 2 -> 4,element=2,k=2:

  • 遍历过程中,前2次遇到2都保留,第3次遇到2时删除,最终链表变成 1 -> 2 -> 2 -> 3 -> 4,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:07:42