IList<T>
接口包含一个索引器,索引器并不是你在 LinkedList
上期望的功能。
List<T>
可以确保在 O(1) 的时间内访问项目,而根据其结构定义,LinkedList
不能在 O(1) 的时间内提供对项目的访问。
List<T>
)所做出的承诺,而不是合同(IList<T>
)的要求。您的答案是错误的,因为提供索引访问可以通过遍历链表来实现。当然,对于一般情况下这样做效率不高,需要O(N)的时间。 - casperOne阅读链表的定义,您就会理解。
主要问题在于,链表可以包含循环引用,因此没有索引。
链表是最简单和最常见的数据结构之一;它们为几个重要的抽象数据结构(包括栈、队列、关联数组和符号表达式)提供了易于实现的方法。
链表相对于传统数组的主要优点是,链接项的顺序可以与存储在内存或磁盘上的数据项的顺序不同。因此,链表允许在列表中的任何位置插入和删除节点,且仅需进行固定数量的操作。
另一方面,链表本身不允许随机访问数据,也不允许任何形式的高效索引。因此,许多基本操作(例如获取列表的最后一个节点、查找包含给定数据的节点或定位应插入新节点的位置)可能需要扫描大部分列表元素。
IEnumerable<T>
一样。 - Kent BoogaartLinkedList是一种广为人知的链表数据结构,其具有以下操作复杂度:
Insertion: O(N)
Removal: O(1)
Indexing: O(N)
List(列表)是一个连续的数组,其算法复杂度如下:
Insertion*: O(1)
Removal*: O(N)
Indexing: O(1)
他们不提供常见接口,因为这会误导用户的接口,并使程序效率不可预测。有关更多信息,请查阅有关算法和数据结构的书籍。
LinkedList不是List。List是对象的单维集合。LinkedList是节点集合,更接近于Dictionary。它的需求与常规List不同,更专门为了允许节点遍历和组织行为。
历史上的怪事:在 .NET 1.1 中,ArrayList 是类似于动态长度数组的类。
在 .NET 2+ 中,List 在内部组织为数组。这意味着 IList 期望数组语义,实际上。
在 .NET 中,列表 像数组,而不是列表......(boing)
真正的链表具有恒定时间的插入、删除,但枚举较慢并且随机访问更慢。
数组具有快速枚举和随机访问,但插入/删除成本高(O(n) 和重新分配可能会很快导致完全不同的行为)
因为通过索引访问链表的时间复杂度不是O(1)。
链表不是一种旨在通过索引访问的数据结构,然而,IList<T>
提供了索引访问功能。
因此,由于无法通过索引访问链表中的项目,因此不能提供试图执行此操作的方法。
LinkedList<T>
相比于List<T>
,提供更快的插入和删除操作,但同时不提供索引操作。这是LinkedList<T>
为了获得更快的插入和删除而做出的一种权衡。同样的,List<T>
也在另一个方向上做出了相同的权衡。 - nawfal