【问题标题】:Implementing a Linked List using array in java?在java中使用数组实现链表?
【发布时间】:2014-02-22 06:46:57
【问题描述】:

我在 robbert laffe 中读到过,我们也可以使用数组来实现链表。但问题是如何?

我确实有以下方法:

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

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

【问题讨论】:

  • 链表的意义在于获得不使用数组的好处,因此尝试实现这样的事情毫无意义。
  • “使用大小为 2 的数组代替 Link 对象,其中一个包含项目和其他对下一个的引用。” - 这是一种以某种方式强制数组进入解决方案的方法。不要那样做!
  • JAVA 和 C 之间存在主要差异。请先阅读 JAVA 书籍。

标签: java arrays linked-list


【解决方案1】:

它被称为 ArrayList

与@trutheality 所说的相反,它们不需要固定容量,并且节点不存储下一项的索引。为了绕过典型数组的大小限制,ArrayList 被设计为在达到预定义的最小/最大边界时自动调整大小。

调整内部数组的大小很昂贵。它包括创建一个新数组并将数据从旧数组移动到新数组。因此,限制所需的调整大小操作的数量是有益的。

一种方法是在列表达到最大容量时将数组大小加倍,并在列表达到 1/4 容量时将其缩小一半。

阵列没有缩小到一半容量的原因是为了避免颠簸。抖动,是指数组在容量边界的边缘增加/减少大小,导致大量调整大小操作而几乎不更改内部数据。

尽管调整大小需要付出代价——因为它只发生在数据集翻倍时——实际性能成本仅为 O(log n)。因此,插入成本是线性 O(N log N),而检索成本是常数 O(N)。

ArrayList 有一个主要弱点。如果您从列表中添加/删除任意项目,则必须移动数组内容以适应更改。一个花费线性 O(N) 时间的操作。

尽管在传统的 LinkedList 中更改任意项的成本很便宜(即恒定 O(1) 时间),但该操作需要查找链中的位置,这需要线性 O(N) 时间。除非您正在创建一个队列,其中列表的两端都经常发生变异,否则使用 ArrayList 作为列表基础可能是更好的选择。

来源:目前正在学习算法课程,刚刚完成了从头开始实现 ArrayList 和 LinkedList。

【讨论】:

    【解决方案2】:

    典型的数组支持链表将整个列表存储在单个数组中,例如:

    class ABLL<T> {
        Node[] theList;
        class Node {
             T item;
             int next; // You store the index of the next node
                       // instead of a reference
        }
        ...
    }
    

    您可以将数组初始化为某个容量,并且它不会超过该容量(除非您添加该功能,这将涉及分配一个新数组并将内容复制到其中)。 您可以搜索“Array-backed Linked List”以找到有关此数据结构的更多讨论。

    这在 Java 中的意义不如在 C 中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      相关资源
      最近更新 更多