我想从此列表中删除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();
}
答案 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
。