在java中使用数组实现链接列表?

时间:2014-02-22 06:46:58

标签: java arrays linked-list

我在robbert laffore中已经阅读过,我们也可以使用数组实现链接列表。但问题是如何?

我确实有以下方法:

1)使用大小为2的数组而不是Link对象,其中一个数组包含项目,另一个数组包含下一个项目。但我认为这不是一个好方法。

有人可以建议使用数组实现链接列表的更好方法吗?

2 个答案:

答案 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中。