我有一个算法,出于性能原因,应使用链接列表。我希望从列表中不断追加和删除元素,并且我永远不需要按索引查找特定元素。
我看到Dart在LinkedList
中有一个dart:collection
(API docs),但这需要所有条目都为LinkedListEntry
的子类。我无法控制放入列表中的元素,我也不想创建包装器。
我在核心Dart SDK中有哪些选择?
答案 0 :(得分:1)
您可以创建可重用的包装器,而不是使每个值成为LinkedListEntry的子类
import 'dart:collection';
class MyLinkedListEntry<T> extends LinkedListEntry {
T value;
MyLinkedListEntry(this.value);
@override
String toString() => '${super.toString()}: ${value}';
}
void main(List<String> args) {
var l = new LinkedList();
var s = new MyLinkedListEntry<String>("SomeString");
l.add(s);
s.insertAfter(new MyLinkedListEntry<int>(125));
l.forEach((e) => print(e));
}
答案 1 :(得分:1)
如果要在两端添加和删除,则需要Queue
。您可以使用ListQueue
(这是使用new Queue()
时的默认设置)或DoubleLinkedQueue
。
前者仅保证在末端添加和删除的摊销常数时间操作,而后者具有绝对保证。 ListQueue
有时需要在添加上增加其后备存储,这需要线性时间,但它只在列表已满时才会发生,并且它执行传统的增长倍增以保证摊销的常量操作。 / p>
如果你只想在最后添加和删除(基本上是一个堆栈),那么普通列表应该没问题。