java - 从 arraylist 和 linkedlist 中删除最后一个元素时的时间复杂度

标签 java list

第 1 部分:-

我在书上读到“数据结构和算法在 Java 中变得简单”,从 Linkedlist 和 Arraylist 中删除最后一个元素的时间复杂度是 O(n)。但是 Linkedlist 内部实现了 DoublyLinkedlist,所以时间复杂度应该是 O(1),同样对于 Arraylist,因为它内部实现了 Array,它应该是 O(1)。

第二部分:-

它还说,在链表的末尾插入一个元素的时间复杂度为 O(n),但链表在末尾和前端都维护指针。那么这个说法正确吗?此外,它表示如果数组未满,则在末尾将元素插入数组列表的时间复杂度为 O(1),如果数组已满,则为 O(n)。为什么 O(n) 如果数组已满?

感谢您回答第一部分。任何人都可以解释第二部分。谢谢:)

最佳答案

这取决于您调用的方法。

看一眼实现就会发现,如果您调用 LinkedList.removeLast(),那就是 O(1)。 LinkedList 维护指向列表中第一个和最后一个节点的指针。因此它不必遍历列表即可到达最后一个节点。

用最后一个元素的索引调用LinkedList.remove(index)也是O(1),因为它从最近的一端开始遍历列表。 [用户@andreas 在下面的评论中指出。]

但是如果您正在调用 LinkedList.remove(Object),那么第一个匹配节点的搜索时间为 O(n)。

类似地,对于 ArrayList,如果您使用最后一个元素的索引调用 ArrayList.remove(index),则为 O(1)。对于所有其他索引,有一个可以是 O(n) 的 System.arrayCopy() 调用——但对于最后一个元素,它被完全跳过了。

但是如果您调用 ArrayList.remove(Object),那么第一个匹配节点的搜索时间也是 O(n)。

关于java - 从 arraylist 和 linkedlist 中删除最后一个元素时的时间复杂度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43145395/

相关文章:

python - 如何根据垂直位置重命名 python 列表列表中的重复元素?

java - 如何用我自己的对象洗牌 list(arrayList> ?

java - Java tcp client <-> Qt tcp server socket通信怎么做

java - 用 JSON 填充数组,但退出方法后丢失信息

c# - 检查 List1<T> 中的所有元素是否都在 List2<T> C# 中

python - 如何根据开始和结束元素从列表创建子列表?

c# Group 然后排序元组列表 <T1,T2,T3>

java - 即使对于无状态类,静态方法在java中总是不被鼓励吗?

java - 如何在Java springs中将字符串数组传递给@PathVariable

java - 如何将复杂的 Json 字符串转换为对象?