我正在尝试从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()?
答案 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)时间可以删除。