据说链接列表中的添加和删除在恒定时间内发生,即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)时,这个操作如何在恒定的时间内发生?
答案 0 :(得分:2)
仅当您具有指向列表上实际节点的指针时,才能在常量时间内删除链接列表中的项目。如果您唯一拥有的是要删除第n个节点的信息,那么就无法知道它是哪一个 - 在这种情况下,您需要先遍历列表,这当然是O (n)的
另一方面,添加总是在恒定时间内工作,因为它与列表中已包含的元素数量无关。在提供的示例中,每次调用add()都是O(1),不包括调用类Stamp的构造函数的成本。添加到链接列表只是将另一个元素附加到其末尾。当然,这是假设链表的实现知道哪个节点当前位于列表的末尾。如果它不知道,那么,当然,需要遍历整个列表。