【问题标题】:Removing min from LinkedList从 LinkedList 中删除 min
【发布时间】:2017-06-08 01:17:39
【问题描述】:

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

【问题讨论】:

    标签: java linked-list priority-queue


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

    【讨论】:

    • 我绝对不会尝试使用 O(n) 随机访问时间对 LinkedList 进行排序。
    • 感谢@BladeCoder。添加了一个不需要排序的答案
    • 同样的性能问题:get(i) 是一个 O(n) 操作,因为 LinkedList 不支持直接访问元素,所以如果您使用索引导航,您将有效地从头开始导航每次迭代。您应该改用迭代器。
    • 按照建议编辑答案:)
    【解决方案2】:

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

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

    这是如何工作的?

    • list.remove(Object o):删除指定的第一次出现 此列表中的元素(如果存在)。如果这个列表没有 包含元素,它是不变的。
    • Collections.min(Collection&lt;? extends T&gt; 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
    

    【讨论】:

      【解决方案3】:

      代码有一些错误。

      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

      【讨论】:

        猜你喜欢
        • 2012-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 2015-08-26
        • 1970-01-01
        相关资源
        最近更新 更多