【问题标题】:Java Linked List: Removing Largest Element Using IteratorJava 链表:使用迭代器删除最大元素
【发布时间】:2011-05-08 01:05:07
【问题描述】:

如何从 java 中的链表中删除最大的元素?我知道我可以使用 get() 或 remove() 函数来检索/删除元素。但我想让它高效。我想使用迭代器。你知道我该怎么做吗?请注意,我不想创建自己的链表。我什至不想对我的链表进行排序。

我可以对此进行线性搜索吗?如果是这样,我如何跟踪指向最大元素的指针(或迭代器)。任何帮助将不胜感激。

【问题讨论】:

    标签: java list linked-list iterator


    【解决方案1】:

    链表(除非已排序)不是您在此处尝试执行的最佳结构,因为您别无选择,只能进行线性搜索并删除最大的元素

    Integer biggest = Integer.MIN_VALUE;
    for(Integer e : myList){
       if(biggest < e)
            biggest = e;
    }
    myList.remove(biggest);
    

    这将是 O(n),即使您必须再次扫描以删除最大的,如果您执行自己的 LinkedList,第二次扫描也是可以避免的,因为 java.util.LinkedList 隐藏了它的 Entry 类并且不允许你修改指针;但这将是错误的优化方法,因为如果您使用类似堆的结构,在 java 中将是 PriorityQueue 类,您可以获得 O(log(n)) 并将代码简化为:

    return myPriorityQueue.poll();
    

    【讨论】:

      【解决方案2】:

      如果你知道最大的元素是什么,你可以这样做

      Iterator<Integer> it = list.iterator();
      Integer toRemove;
      while(it.hasNext()){
          if(toRemove.compareTo(it.next()==0){
             it.remove();
             break;
          }
      }
      

      或使用 list.removeFirstOccurrence(toRemove)

      但 LinkedList 实现不允许复制迭代器以指向特定元素以供以后删除

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-11
        • 2016-07-19
        • 2021-05-05
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        相关资源
        最近更新 更多