标题大多是不言自明的:链表比二叉树有什么优势?我能想到的唯一一个链表更有效的情况是迭代每个元素,在这种情况下,它仍然非常接近。看起来二进制树在访问数据和插入新元素方面都更快。那么为什么要使用链表呢?
答案 0 :(得分:6)
如果存储了链表的尾部,那么插入链表肯定比插入二叉树更快。如果不平衡,在最坏情况下插入二叉树是O(N)(最好是O(log N))。如果它是平衡的,那么插入是O(log N),但是有保持平衡的家务。如果保留尾部,则插入链表是O(1)。
此外,作为BillyONeal mentioned,二叉树通常是一个关联结构,而链表则不是。
答案 1 :(得分:3)
与二叉树相比,从链表中删除项目更容易/更快,这可能需要很少的操作来修复树。
答案 2 :(得分:2)
链接列表通常不用作关联容器(READ:不用作字典) - 仅作为项目的文字列表,如数组。当需要这种简单的数据结构时,二叉树的性能很差。
答案 3 :(得分:2)
在链表中,对象按容器本身排序,因此您无需为对象提供比较功能。
答案 4 :(得分:0)
一个公平的问题。我喜欢使用最“紧密”符合我需求的容器。例如,当你需要的只是一个没有实际结果的队列时,你可以使用一个列表......但是......队列是针对这个特定任务弹出的高度优化的,从前面弹出,然后插入后面,没有额外的指针,或任何东西。通过使用最合适的类,即使它具有相同的Big-O,您也可以确保没有任何额外的绒毛。有时隐藏的常量 很重要。
答案 5 :(得分:0)
主要取决于情景。如果保持链表的尾部,则在链表中插入很快。在链表中删除速度非常快但在搜索时最好在树中(o(高度平衡树的log(n))而链表中的o(n)。
答案 6 :(得分:0)
我假设你在谈论实际的二进制搜索树,其中使用算法添加节点以最大化检索性能。而不是一个简单的树,其中每个节点最多有2个子节点。
链表通常是未排序的,因此通常通过附加到列表的尾部来添加新节点就是O(1)操作。
另一方面,二叉树必须以特定的排序机制存储节点(并可能强制平衡),以提供更有效的搜索/检索操作。
如果您的算法不需要非常有效地检索项目,同时还提供项目的有效排序,则可能只需要链接列表。
队列和堆栈是可以使用链表快乐实现的数据结构的示例。
注意:插入链接列表的操作与基本添加/追加不同(较慢)。插入通常需要遍历列表,直到找到正确的位置,O(n)其中n是列表长度。附加只是添加到列表的尾部(因此O(1))