我在robbert laffore中已经阅读过,我们也可以使用数组实现链接列表。但问题是如何?
我确实有以下方法:
1)使用大小为2的数组而不是Link对象,其中一个数组包含项目,另一个数组包含下一个项目。但我认为这不是一个好方法。
有人可以建议使用数组实现链接列表的更好方法吗?
答案 0 :(得分:2)
它被称为 ArrayList
与@trutheality所说的相反,他们不需要固定容量,并且节点不会将索引存储到下一个项目。为了解决典型数组的大小限制,ArrayLists设计为在达到预定义的最小/最大边界时自动调整大小。
调整内部阵列的大小非常昂贵。它包括创建一个新数组并将数据从旧数组移动到新数组。因此,限制所需的调整大小操作的数量是有益的。
一种方法是在列表达到最大容量时将数组大小加倍,并在列表达到1/4容量时将其缩小一半。
阵列没有缩小到半容量的原因是为了避免颠簸。颠簸,就是当一个数组在容量边界的边缘上增大/减小时,导致大量的调整大小操作而内部数据几乎没有变化。
尽管调整大小的费用 - 因为它只发生在数据集加倍时 - 实际的性能成本只有O(log n)。因此,插入成本是线性O(N log N),而检索是常数O(N)。
ArrayLists有一个主要缺点。如果从列表中添加/删除任意项,则必须移动数组内容以适应更改。耗费线性O(N)时间的操作。
即使在传统LinkedList中更改任意项目的成本很低(即常数O(1)时间),操作也需要查找以找到链中的位置,该位置花费线性O(N)时间。除非您正在创建一个队列,其中列表的两端经常变异,否则使用ArrayList作为列表基础可能是更好的选择。
来源:目前正在参加算法课程,刚刚从头开始实现了ArrayList和LinkedList。
答案 1 :(得分:0)
典型的阵列支持链表将整个列表存储在一个数组中,例如:
class ABLL<T> {
Node[] theList;
class Node {
T item;
int next; // You store the index of the next node
// instead of a reference
}
...
}
您可以将阵列初始化为某个容量,并且它不会超出该容量(除非您添加该功能,这将涉及分配新阵列并将内容复制到其中)。 您可以搜索“阵列支持的链接列表”以查找有关此数据结构的更多讨论。
这在Java中的意义不如在C中。