从Java链接列表中删除最小元素

时间:2017-03-27 13:29:59

标签: java data-structures

我正在尝试从Java LinkedList中删除最小元素。

为了找到最小值,我必须遍历LinkedList一次。我想保存该元素的Node或Iterator,以便在O(1)中删除它。

正常

list.remove(Object o)

采取O(n)步骤。

void removeMin(LinkedList<Integer> list) {
    ListIterator<Integer> itList = list.listIterator();

    Integer min = itList.next();

    while(itList.hasNext()) {
        Integer curVal = itList.next();
        if(curVal < min) {
            min = curVal 
            // Copy the iterator here?
        }        
    }
    // remove min from list here.
}

有没有办法,在找到新的最小值时复制迭代器,所以我之后可以调用迭代器的remove()?

3 个答案:

答案 0 :(得分:1)

您可以通过以下方式复制当前.next索引处的迭代器:

ListIterator<Integer> minItList = List.listIterator(itList.nextIndex());

解决方案就像:

ListIterator<Integer> itList = list.listIterator();
ListIterator<Integer> minItList = list.listIterator();

Integer min = itList.next();

while(itList.hasNext()) {
    Integer curVal = itList.next();
    if(curVal < min) {
        min = curVal; 
        // Copy the iterator here?
        minItList = list.listIterator(itList.nextIndex());
    }        
}
  // remove min from list here.
  minItList.previous();  
  minItList.remove();  //note that you can't call .remove() on list iterator until .next() or .previous() have been called once because you will get IllegalStateException

答案 1 :(得分:0)

我不知道它是否更快但您可以使用Collections.min(...)

void removeMin(LinkedList<Integer> list) {
    list.remove(Collections.min(list));
}

答案 2 :(得分:0)

以任何方式,如果你使用顺序搜索符号表(无序链表),在最坏的情况下,最小元素的查找将是O(N)+ O(M)for removeOperation其中M节点的“位置”。 也许你应该使用二进制搜索符号表(有序)在头部存储最小值,你用O(1)时间可以删除。