我认为我错过了一个非常明显的观点,但在我的Java教科书中找不到它。
据我所知,节点存储不一定必须在内存中连续列表。这是否也意味着链表不可索引?如果是这样,那么在链表中查找项目的唯一方法是遍历列表,右边,而你可以通过索引从数组中test:
exit 1 ;\
echo 'hi' ;\
?
答案 0 :(得分:5)
为什么在链接列表中按索引访问项目的速度比数组慢?
链表有一系列条目。如果你想得到(说)位置42
的元素,代码必须:
0
)next
1
链接
next
2
链接
等......总共42次。
没有捷径。
我仍然不明白为什么链表不可索引....
现在,LinkedList
可以编入索引,因为get(int)
操作可以正常运行。只是索引LinkedList
效率低下。通常,在O(N)
的链接列表中执行get(i)
需要N
个步骤。与数组或ArrayList
相比,您可以在一个步骤中检索数据结构的任何元素。我们说复杂性是O(1)
。
将此与一般Set
个对象进行对比,特别是HashSet
。 HashSet
类不可索引,因为没有get(int)
方法来检索位置i
的set元素。实际上,甚至连一组中“位置i”的概念也毫无意义。 Set
中元素的排序未指定,(对于某些Set
实现,如HashSet
),它可能实际上是不确定的。
答案 1 :(得分:1)
一些链接列表实现提供了一种使用索引访问它的元素的方法,但事实是如果你想在链表中获得第10个元素,你的编译器仍然必须经历从0到9的所有序列,因为元素可能会传遍记忆。另一方面,当您使用索引在数组中请求第10个元素时,编译器会计算第10个元素的确切位置并直接跳转到该元素。数组和列表有不同的用途;如果您的算法需要在数据结构上前后移动,那么使用数组效率很高。如果您主要需要添加/删除操作,那么使用列表
是有效的答案 2 :(得分:0)
使用链接列表,您可以随时添加和删除元素,因此索引没有任何意义。想象一下,您创建了一个指向列表第三个元素的索引。之后,在列表的开头插入一个新元素。什么值应该返回索引?
然而,例如,可以在列表的中间创建索引,并且只有在列表的后半部分添加o remove元素时才使用它。
@paxdiablo在这里解释得很清楚Is there a known implementation of an indexed linked list?