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

如何用LinkedList实现优先级队列?解决中间元素插入失败问题

问题分析与修复方案

你的代码无法插入中间元素的核心问题在于中间插入的循环范围错误,以及缺少插入后的终止逻辑,导致符合条件的插入位置未被遍历到,甚至可能出现重复插入的情况。

具体问题点

当列表长度为2时(比如[ann, bob]),原循环条件for(int i = 1; i < myList.size() - 1; i++)中,myList.size()-1等于1,i < 1不成立,循环直接跳过,完全没执行中间插入的逻辑,所以art无法被插入。

此外,找到插入位置后没有终止循环,若列表中有多个符合条件的位置(比如重复元素),会导致重复插入。

修复后的myPush方法

public static void myPush(String names) {
    if (myList.isEmpty()) {
        myList.add(names);
    } else if (myList.size() == 1) {
        if (names.compareTo(myList.get(0)) < 0) {
            myList.push(names);
        } else {
            myList.add(names);
        }
    } else if (names.compareTo(myList.get(0)) < 0) {
        myList.push(names);
    } else if (names.compareTo(myList.get(myList.size() - 1)) > 0) {
        myList.add(names);
    } else {
        // 调整循环范围:遍历从索引1到列表末尾
        for (int i = 1; i < myList.size(); i++) {
            if (names.compareTo(myList.get(i)) <= 0 && names.compareTo(myList.get(i - 1)) >= 0) {
                myList.add(i, names);
                // 插入后立即终止循环,避免重复插入
                break;
            }
        }
    }
}

修复说明

  1. 调整循环范围:将i < myList.size() - 1改为i < myList.size(),确保列表长度为2时,循环能执行到唯一的中间位置(索引1)。
  2. 添加循环终止逻辑:插入元素后执行break,避免因列表动态扩容导致的重复插入问题,同时提升执行效率。

测试验证

按你的测试步骤:

  1. 添加bob → 列表为[bob]
  2. 添加ann → 因ann小于bob,插入头部 → 列表为[ann, bob]
  3. 添加art → 进入中间插入逻辑,遍历到i=1时,art介于ann和bob之间,插入到索引1的位置 → 列表变为[ann, art, bob],符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 15:27:48