从 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
。
我想从此列表中删除 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
。