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

Java链式队列实现删除奇数功能遇到问题,寻求正确实现方案

链式队列删除奇数元素实现方案

现有代码存在的问题

  • 你当前写的deleteOdd方法仅处理了队首第一个元素,没有遍历整个队列的所有元素,无法实现删除全部奇数的需求
  • 把奇数重新入队的逻辑完全错误,这会导致奇数一直在队列里循环,不会被删除
  • 手动修改front和rear指针的操作会破坏队列原有结构,同时和enqueue内置的计数逻辑冲突,会导致siz属性计数异常
  • 额外bug提醒:你原有dequeue方法存在两个问题,一是有一行多余的空语句if (front != null) ;,二是单元素出队时没有执行siz--,会导致队列长度计数错误。

正确实现思路

不需要手动操作节点指针,直接利用队列已有的出队、入队方法实现:

  1. 先获取当前队列的原始长度,确保只遍历原有元素,不会重复处理后续新入队的元素
  2. 循环遍历所有原有元素:每个元素出队后判断是否为偶数,是偶数就重新入队,奇数直接丢弃
  3. 遍历完成后队列中剩余的就全是偶数元素

修正后代码示例

先修正dequeue方法的bug

public Node dequeue() {
    Node response = null;
    if (front != null) {
        if (front.getNext() != null) {
            response = new Node(front.getData());
            front = front.getNext();
            siz--;
        } else {
            response = new Node(front.getData());
            front = null;
            rear = null;
            siz--; // 补充单元素出队的长度减1逻辑
        }
    }
    return response;
}

完整deleteOdd方法实现

public void deleteOdd() {
    if (isEmpty()) {
        System.out.println("Queue = Empty");
        return;
    }
    // 获取原始队列长度,仅遍历原有元素
    int originalSize = getSiz();
    for (int i = 0; i < originalSize; i++) {
        int currentData = dequeue().getData();
        // 偶数重新入队,奇数直接丢弃
        if (currentData % 2 == 0) {
            enqueue(currentData);
        }
    }
    // 输出删除后的队列
    System.out.print("Queue = ");
    display();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 02:36:02