实际上是链接列表添加O(N)还是O(1)?

时间:2012-01-25 10:27:38

标签: linked-list

据说链接列表中的添加和删除在恒定时间内发生,即O(1),但是对元素的访问在时间上与列表的大小成比例,即O(N)。我的问题是如何在没有首先遍历的情况下删除或添加任何元素?在这种情况下,是否也不添加或删除O(N)的顺序?

以Java为例,当我们像这样使用api时会发生什么:


   LinkedList stamps = new LinkedList();

   stamps.add(new Stamp("Brazil"));
   stamps.add(new Stamp("Spain"));
   ---
   ----
   stamps.add(new Stamp("UnitedStates");  //say this is kth element in the list
   ----
   stamps.add(new Stamp("India");

然后当某人做了stamps.remove(k)时,这个操作如何在恒定的时间内发生?

1 个答案:

答案 0 :(得分:2)

仅当您具有指向列表上实际节点的指针时,才能在常量时间内删除链接列表中的项目。如果您唯一拥有的是要删除第n个节点的信息,那么就无法知道它是哪一个 - 在这种情况下,您需要先遍历列表,这当然是O (n)的

另一方面,添加总是在恒定时间内工作,因为它与列表中已包含的元素数量无关。在提供的示例中,每次调用add()都是O(1),不包括调用类Stamp的构造函数的成本。添加到链接列表只是将另一个元素附加到其末尾。当然,这是假设链表的实现知道哪个节点当前位于列表的末尾。如果它不知道,那么,当然,需要遍历整个列表。