使用链表实现数组(反之亦然)

时间:2014-12-24 11:57:10

标签: arrays linked-list

在了解了类中的数组和链表后,我很好奇是否可以使用数组创建链表,反之亦然。

  1. 要使用数组创建链表,我是否可以将链表的第一个值存储在数组的索引0处,指向数组索引1处的下一个节点的指针,依此类推?我想我很困惑,因为“指向下一个”的指针似乎是多余的,因为我们知道存储下一个节点的值的索引将始终是:当前节点的值的索引+ 2.

  2. 我认为使用链表创建数组是不可能的,因为数组涉及连续内存,但链表可以将节点存储在计算机内存的不同部分。有没有办法解决这个问题?

  3. 提前致谢。

2 个答案:

答案 0 :(得分:1)

基于数组的链表通常以二维数组定义,如:

enter image description here

好处:该列表仅占用最初定义的特定内存量。

向下:该列表只能包含特定预定义数量的项目。

作为单个链表,数据结构必须保持头指针。此数据结构包含头指针,但在此特定实现中,它是一个int。列表的头部是将索引保存到第一个节点的指针。第一个节点将索引保存到下一个节点,依此类推。列表中的最后一个节点将保留下一个值-1。这将指示列表的结尾。将索引作为元素的事实添加到结构中需要空闲列表头。这个免费列表被合并到相同的2-dementional数组中。正如头部是一个int,自由列表指针是一个int。

enter image description here

现在数据结构由3个主要元素组成。头指针,自由头指针和二维数组。必须正确初始化列表才能使用列表。该列表应初始化如下。

enter image description here

参考是link

答案 1 :(得分:0)

您可以将链接列表存储在数组中,但仅限于您拥有有序列表。正如您所说,您不需要指针,因为您知道顺序(它在数组排序中是明确的)。在数组或链表之间进行选择的主要区别是:

  • 阵列是静态的"因为项目在其元素中是固定的。您无法移除元素并让阵列自动将以下元素向下移动。当然你可以绕过"空"迭代中的元素,这需要特定的逻辑。使用链接列表,如果删除元素,它就会消失。使用数组,您必须将所有后续元素混乱。
  • 因此,通常使用链接列表,其中元素的插入/删除是最常见的活动。数组最常用,需要访问权限(直接访问[通过索引])。
  • 您可能会看到链接列表优于数组的另一个方面是排序(需要或频繁排序)。这样做的原因是链表排序只需要指针操作,而aray排序需要交换和重排。也就是说,许多排序算法无论如何都会创建新的数组(合并排序是典型的),这会减少这种开销(尽管对于排序的数组需要相同的内存)。
  • 例如,如果您将链接列表标记为"只读",您可以稍微混合一下您的比喻。也就是说,您可以创建指向链表中每个节点的指针数组。这样,您就可以对链接列表进行索引访问。一旦元素从链表中添加或删除(因此只读方面),数组就会过时(以上述方式)。

所以,回答你的具体问题:

1)这样做没有价值 - 按照上面的详细说明

2)您还没有提供足够的信息来回答连续内存分配的问题。它取决于很多:操作系统,体系结构,编译器实现。你甚至没有提到编程语言。简而言之,在链表和数组之间进行选择与连续内存分配几乎没有关系,更多与使用有关。例如,java LinkedList类和ArrayList类都代表List实现,但是根据使用模式进行了专门化。预计LinkedList对于"列表"表现更好。期待高度修改(虽然在几年前完成的测试中证明这一点可以忽略不计 - 我不确定最新版java中的状态)。

此外,您通常不会创建一个带有链接列表的数组"或相反亦然。它们都是用于构建更大组件的抽象数据结构。它们代表了更广泛背景下的事物列表(例如,某个部门有员工列表)。每种数据类型都具有使用优势。同样,您可以使用集合,队列,堆栈等。这取决于您的使用需求。

我真的希望我不会再困扰你了!