Java链式队列实现删除奇数功能遇到问题,寻求正确实现方案
链式队列删除奇数元素实现方案
现有代码存在的问题
- 你当前写的
deleteOdd方法仅处理了队首第一个元素,没有遍历整个队列的所有元素,无法实现删除全部奇数的需求 - 把奇数重新入队的逻辑完全错误,这会导致奇数一直在队列里循环,不会被删除
- 手动修改
front和rear指针的操作会破坏队列原有结构,同时和enqueue内置的计数逻辑冲突,会导致siz属性计数异常 - 额外bug提醒:你原有
dequeue方法存在两个问题,一是有一行多余的空语句if (front != null) ;,二是单元素出队时没有执行siz--,会导致队列长度计数错误。
正确实现思路
不需要手动操作节点指针,直接利用队列已有的出队、入队方法实现:
- 先获取当前队列的原始长度,确保只遍历原有元素,不会重复处理后续新入队的元素
- 循环遍历所有原有元素:每个元素出队后判断是否为偶数,是偶数就重新入队,奇数直接丢弃
- 遍历完成后队列中剩余的就全是偶数元素
修正后代码示例
先修正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
相关产品推荐
相关产品推荐

