簡體   English   中英

從LinkedList刪除分鍾

[英]Removing min from LinkedList

我想從此列表中刪除3,但不確定從哪里開始。 我將一個數字序列存儲在實現鏈接列表的Priority Queue中,並嘗試使用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類:

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

這個如何運作?

  • list.remove(Object o) :從列表中刪除第一次出現的指定元素(如果存在)。 如果此列表不包含該元素,則它保持不變。
  • Collections.min(Collection<? extends T> coll) :根據給定集合的最小順序,返回其最小元素。

此外,如果集合中的最小值超過一個,則可以執行以下操作:

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 (top是列表的第一個元素)。

執行此操作時,可以執行pq.remove()來刪除min element

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM