我很好奇在LinkedList开头插入元素的时间复杂度。我知道 LinkedList 本身会将现有元素向右移动一个索引,但要做到这一点,它会进行与列表中现有元素一样多的迭代吗?
另外,在开头插入的最佳方法是offerFirst吗?
我很好奇在LinkedList开头插入元素的时间复杂度。我知道 LinkedList 本身会将现有元素向右移动一个索引,但要做到这一点,它会进行与列表中现有元素一样多的迭代吗?
另外,在开头插入的最佳方法是offerFirst吗?
添加到 a 的前面是LinkedList
在恒定时间内发生的:
public void addFirst(E e)
{
addBefore(e, header.next);
}
private Entry<E> addBefore(E e, Entry<E> entry)
{
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
它不受元素需要移动的数组的支持。如您所见,需要做的只是一组参考重新分配。
编辑:
为了解决您对 的担忧offerFirst
,只需:
public boolean offerFirst(E e)
{
addFirst(e);
return true;
}
因此,正如我在评论中所说,只有在您想要boolean
退货时才使用它。
在列表的前面插入一个项目只会做两件事(都是非常轻量级的):
1) 更新 HEAD 指针(这是告诉我们第一个元素在哪里的指针)
2) 将新元素的 NEXT 指针设置为旧的 HEAD 元素。
这是一个非常轻量级的操作,代表了链表的优势之一。
我不太了解Java,但是由于offerFirst 旨在将元素添加到列表的前面,因此它可能是最好的方法。