java.util.LinkedList中addLast()或add()或offer()等效方法的渐近复杂度是多少?是O(N)还是O(1)?也就是说,LinkedList是否在内部保留指向其尾部的指针,还是从头部遍历列表?
无论哪种方式,您如何使用FIFO提取具体实现,该实现在offer()方法中更有效但仍然使用标准库? (没有自定义队列实现)。 LinkedList是一个不错的选择还是其他什么?
我之前可能已经意识到这个问题,但是在搜索了很长一段时间后我找不到答案。
答案 0 :(得分:3)
是的,列表中有一个指向尾部的指针,您可以在class JavaDoc中阅读。
所有操作的执行都与双向链表一样。索引到列表中的操作将从开头或结束遍历列表,以较接近指定索引为准。
因此addLast()
和add()
等操作需要O(1)时间。
文档明确指出LinkedList适用于队列实现。
List接口的链接列表实现。实现所有可选列表操作,并允许所有元素(包括null)。除了实现List接口之外,LinkedList类还提供统一命名的方法来获取,删除和插入列表开头和结尾的元素。这些操作允许链表用作堆栈,队列或双端队列。
答案 1 :(得分:2)
<强> addlast仅()强>
O(1),Java只需创建一个新节点并将其先前的节点值指向现在倒数第二个节点,然后将该节点的下一个节点值指向新创建的节点。
添加()强>
如果指定索引,则为O(N)(实际上是N / 2,因为它根据您指定的索引从前面或后面移动)。如果您没有指定索引,则为O(1),因为它与addLast()
基本相同