从LinkedList中删除min

时间:2017-06-08 01:17:39

标签: java linked-list priority-queue

我想从此列表中删除3但我不知道从哪里开始。我在优先级队列中存储了一系列数字,这些数字实现了一个链表并试图找到min并使用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();
    }

3 个答案:

答案 0 :(得分:1)

试试这个:

解决方案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);

答案 1 :(得分:1)

在一行代码中实现此目的的一种简单方法是使用Collections类:

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

这是如何运作的?

  • list.remove(Object o):删除指定的第一个匹配项 此列表中的元素(如果存在)。如果这个清单没有 包含元素,它没有变化。
  • Collections.min(Collection<? extends T> coll):根据元素的自然顺序返回给定集合的最小元素。

此外,如果您在集合中有多个 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

答案 2 :(得分:0)

代码有一些错误。

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