Dart是否提供易于使用的链表?

Dart是否提供易于使用的链表?,dart,Dart,我有一个算法,出于性能原因,应该使用链表。我希望在列表中添加和删除元素的时间是恒定的,而且我永远不需要按索引查找特定的元素 我看到Dart在Dart:collection中有一个LinkedList(),但这要求所有条目都要子类LinkedListEntry。我不控制需要放入列表的元素,也不想创建包装器 我在核心Dart SDK中有哪些选项?您可以创建一个可重用的包装器,而不是将每个值作为LinkedListEntry的子类 导入“dart:collection”; 类MyLinkedListE

我有一个算法,出于性能原因,应该使用链表。我希望在列表中添加和删除元素的时间是恒定的,而且我永远不需要按索引查找特定的元素

我看到Dart在
Dart:collection
中有一个
LinkedList
(),但这要求所有条目都要子类
LinkedListEntry
。我不控制需要放入列表的元素,也不想创建包装器


我在核心Dart SDK中有哪些选项?

您可以创建一个可重用的包装器,而不是将每个值作为LinkedListEntry的子类

导入“dart:collection”;
类MyLinkedListEntry扩展了LinkedListEntry{
T值;
MyLinkedListEntry(this.value);
@凌驾
字符串toString()=>“${super.toString()}:${value}”;
}
void main(列表参数){
var l=新的LinkedList();
var s=新的MyLinkedListEntry(“SomeString”);
l、 添加(s);
s、 插入者(新MyLinkedListEntry(125));
l、 forEach((e)=>print(e));
}

如果要在两端添加和删除,则需要一个
队列
。您可以使用
ListQueue
(这是使用
new Queue()
时获得的默认值)或
DoubleLinkedQueue
。 前者仅保证在末尾添加和删除的摊销固定时间操作,而后者具有绝对保证。
ListQueue
有时需要在add上增长其备份存储,这需要线性时间,但它只在列表已满时发生,并且它通过加倍来实现传统的增长,以保证摊销常量操作


如果您只想在末尾添加和删除(基本上是堆栈),则正常列表应该可以。

True,但如果可能,我希望避免使用包装器。:)LinkedList元素需要下一个/上一个指针。你不可能不实现
LinkedListEntry
或者不使用这样的包装器。队列(DoubleLinkedQueue而不是ListQueue)在场景后面以这种方式进行。它是一个用于隐藏LinkedListEntryRapper的包装器;-)我怀疑答案是“使用队列”,但仍然很好奇。队列API文档没有关于使用成本的详细信息。
ListQueue
文档说:“保留元素的循环缓冲区,当它填满时会增长到更大的缓冲区。这保证了固定时间的peek和remove操作,以及摊销的固定时间add操作。”并且
DoubleLinkedQueue
说“允许固定时间添加、末尾删除和查看操作。”-队列接口没有说明任何内容,因为子实现可能不同。感谢@lrn。阅读有关队列的内容并没有将我指向ListQueue或DoubleLinkedQueue。我想知道我们是否可以链接(哈哈,明白了吗?)文档中的两个。我总是发现LinkedList实现错误。Java的LinkedList是正确的方式,它提供了列表接口,没有进一步的限制,Dart LinkedList没有。我不认为任何人会在队列上使用LinkedList。