我很想知道在LinkedList开头插入元素的时间复杂性。我理解LinkedList本身会将现有元素的一个索引向右移动但是,要做到这一点,它会进行与列表中现有元素一样多的迭代吗?
此外,是在offerFirst开始插入的最佳方法吗?
答案 0 :(得分:4)
在恒定时间内添加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 :(得分:0)
在列表的前面插入一个项目只会做两件事(都非常轻量级):
1)更新HEAD指针(这是指示第一个元素在哪里的指针)
2)将新元素的NEXT指针设置为旧的HEAD元素。
这是一个非常轻量级的操作,代表了链接列表的优势之一。
我不太了解Java,但由于offerFirst旨在将一个元素添加到列表的前面,这可能是最好的方法。