2

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

另外,在开头插入的最佳方法是offerFirst吗?

4

2 回答 2

7

添加到 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退货时才使用它。

于 2013-07-25T00:41:29.053 回答
1

在列表的前面插入一个项目只会做两件事(都是非常轻量级的):

1) 更新 HEAD 指针(这是告诉我们第一个元素在哪里的指针)

2) 将新元素的 NEXT 指针设置为旧的 HEAD 元素。

这是一个非常轻量级的操作,代表了链表的优势之一。

我不太了解Java,但是由于offerFirst 旨在将元素添加到列表的前面,因此它可能是最好的方法。

于 2013-07-25T00:43:27.383 回答