在LinkedList的开头插入的时间复杂度

时间:2013-07-25 00:36:57

标签: java collections linked-list

我很想知道在LinkedList开头插入元素的时间复杂性。我理解LinkedList本身会将现有元素的一个索引向右移动但是,要做到这一点,它会进行与列表中现有元素一样多的迭代吗?

此外,是在offerFirst开始插入的最佳方法吗?

2 个答案:

答案 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旨在将一个元素添加到列表的前面,这可能是最好的方法。