简单,链接和双链表:何时以及为什么?

时间:2009-04-03 03:13:53

标签: data-structures language-agnostic linked-list

在什么情况下我应该使用每种列表?每个人有什么好处?

4 个答案:

答案 0 :(得分:14)

普通清单:

按顺序存储每个项目,因此随机查找非常快(即我可以立即说“我想要657415671567th元素,直接进入它,因为我们知道它的内存地址将比第一个项目大657415671567”)。这在存储中几乎没有内存开销。但是,它无法自动调整大小 - 你必须创建一个新数组,复制所有值,然后删除旧数据。当需要查找时,普通列表很有用来自列表中任何位置的数据,您知道您的列表不会超过一定的大小。

链接列表:

每个项目都有对下一个项目的引用。这意味着存在一些开销(将引用存储到下一个项目)。另外,因为它们没有按顺序存储,所以你不能立即转到657415671567th元素 - 你必须从头开始(第一个元素),然后得到它的引用转到第二个,然后得到它的引用,到达第三个,...然后得到它的参考到657415671566th,然后得到它的参考到达657415671567th。这样,随机查找效率非常低。但是,它允许您修改列表的长度。如果您的任务是按顺序遍历每个项目,那么它与普通列表的值大致相同。如果您需要更改列表的长度,它可能比普通列表更好。如果您知道第566个元素,并且您正在寻找第567个元素,那么您需要做的就是遵循对下一个元素的引用。但是,如果您知道第567个并且您正在寻找第566个,那么找到它的唯一方法是再次从第1个元素开始搜索。这是Double Linked Lists派上用场的地方......

双联名单:

双链表存储对前一个元素的引用。这意味着您可以遍历列表向后以及向前。在某些情况下(例如“链接列表”部分中给出的示例),这可能非常有用。除此之外,它们与链接列表具有大部分相同的优点和缺点。


评论部分回答:

用作队列:
您必须考虑所有这些优点和缺点:您能否自信地说您的队列将具有最大尺寸?如果你的队列长度可以是1到10000000000个元素,那么普通列表只会浪费内存(然后甚至可能不够大)。在那种情况下,我会使用链接列表。但是,您应该实际存储节点,而不是存储前后的索引

回顾:链接列表由“节点”组成,每个节点都存储该项以及对下一个节点的引用

因此,您应该存储对第一个节点和最后一个节点的引用。因此,当你排队时,你将一个新节点贴在后面(通过将旧的后节点连接到新的后节点),并记住这个新的后节点。并且,当您出列时,删除前节点,并记住第二个节点作为新的“前节点”。这样,您不必担心任何中间元素。因此,您可以忽略队列的长度(尽管如果您真的想要也可以存储它)

答案 1 :(得分:2)

没有人提到我最喜欢的链表:循环链表和指向最后一个元素的指针。您可以在任一端获得恒定时间的插入和删除,以及恒定时间的破坏性附加。唯一的代价是空列表有点棘手。这是一个甜蜜的数据结构:列表,队列和堆栈都在一个。

答案 2 :(得分:1)

使用单链表,您只能前进。使用双向链表,您可以在列表中向后和向前遍历。通常,如果您要使用链接列表,则没有充分的理由不使用双向链表。我在学校里只使用过单一链接。

答案 3 :(得分:1)

双向链表的一个优点是删除指定指针的节点为O(1)。