在实践中是链表加O(N)或O(1)

  • 本文关键字:实践中 链表 linked-list
  • 更新时间 :
  • 英文 :


据说链表中的添加和删除是在恒定的时间内发生的,即O(1),但对元素的访问是在与列表大小成比例的时间内进行的。我的问题是,如何在不首先遍历的情况下删除或添加任何元素?在这种情况下,增加或删除的顺序不是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");

那么,当有人做stamp.remove(k)时,这个操作怎么会在恒定时间内发生呢?

只有当您有一个指向列表上实际节点的指针时,从链接列表中删除项目才能在恒定时间内工作。如果你唯一拥有的是你想要删除第"n"个节点的信息,那么就无法知道它是哪一个——在这种情况下,你需要首先遍历列表,当然是O(n)。

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

相关内容

  • 没有找到相关文章