从 LinkedList 中删除最小值

Removing min from LinkedList

我想从此列表中删除 3 个,但我不确定从哪里开始。我将一系列数字存储在实现链表的优先级队列中,并尝试使用 removeMin 方法

找到最小值并将其从优先级队列中删除
import java.util.Iterator;
import java.util.LinkedList;
public class Test {

    static LinkedList<Integer> list = new LinkedList<Integer>();

    public static void main(String[] args) {

        list.add(10);
        list.add(4);
        list.add(12);
        list.add(3);
        list.add(7);
        System.out.println(removeMin());
    }

    public static Integer removeMin() {
        LinkedList<Integer> pq = new LinkedList<Integer>();
        Iterator it = pq.iterator();

        for (int i = 0; i < list.size(); i++) {
            pq.add(list.remove());
        }

        int min = pq.get(0);

        while (it.hasNext()) {
            // help here
        }

        return pq.remove();
    }

试试这个:

解决方案 1

LinkedList<Integer> list = new LinkedList<Integer>();
        list.add(10);
        list.add(4);
        list.add(12);
        list.add(3);
        list.add(7);
        Collections.sort(list);
        list.removeFirst();
        list.forEach(System.out::println);

解决方案 2:

 LinkedList<Integer> list = new LinkedList<Integer>();
    list.add(10);
    list.add(4);
    list.add(12);
    list.add(3);
    list.add(7);

    int min=Integer.MAX_VALUE;
    int pos=0;
    int remPos=0;
    Iterator<Integer> iterator = list.iterator();

    while(iterator.hasNext()){
        Integer element = iterator.next();
        if(element<min){
            min=element;
            remPos=pos;
        }
        pos++;
    }

    list.remove(remPos);
    list.forEach(System.out::println);

在一行代码中实现这一点的一种简单方法是使用 Collections Class:

list.remove(Collections.min(list));
System.out.println(list); // to test

这是如何工作的?

  • list.remove(Object o):删除指定的第一次出现 此列表中的元素(如果存在)。如果这份名单没有 包含元素,它是不变的。
  • Collections.min(Collection<? extends T> coll): Returns 给定集合的最小元素,根据其元素的自然排序。

此外,如果您在集合中有多个 min 值,您可以这样做:

final Integer min = Collections.min(list);
while(list.contains(min)){ // to remove all min value occurrences in list 
      list.remove(min);
}
System.out.println(list); // to test

代码有一些错误。

for (int i = 0; i < list.size(); i++) {
        pq.add(list.remove());
}

当您在 pq 中复制列表时,您使用的是 list.size(),但您也在循环中删除了列表的元素。所以你不会复制所有元素,因为 size 会减少。

还有,你没有实现priority queue,只是复制了list。为了制作 priority queue 你必须按顺序插入元素。然后 min element 将在队列的 top 处(顶部是列表的第一个元素)。

执行此操作时,您可以执行 pq.remove() 以删除 min element