ZetCode

Dart DoubleLinkedQueueEntry

最后修改于 2025 年 4 月 4 日

在 Dart 中,DoubleLinkedQueueEntry 代表 DoubleLinkedQueue 中的一个元素。它提供了指向相邻元素的链接以及操作队列位置的方法。

每个条目包含一个值,并维护对下一个和上一个条目的引用。这使得在任何位置进行插入和删除操作都非常高效。

DoubleLinkedQueueEntry 的基本用法

让我们从 DoubleLinkedQueueEntry 的基本用法开始,以了解它的作用。

main.dart
import 'dart:collection';

void main() {
  var queue = DoubleLinkedQueue<String>();
  queue.add('Apple');
  queue.add('Banana');
  queue.add('Cherry');

  // Get first entry
  var firstEntry = queue.firstEntry();
  print('First value: ${firstEntry!.value}');

  // Get next entry
  var nextEntry = firstEntry.nextEntry();
  print('Next value: ${nextEntry!.value}');

  // Get previous from next (should be first)
  var prevEntry = nextEntry.previousEntry();
  print('Previous value: ${prevEntry!.value}');
}

这个例子展示了队列条目之间的基本导航。我们访问第一个条目,然后是它的下一个条目,并验证我们可以向后导航。

$ dart main.dart
First value: Apple
Next value: Banana
Previous value: Apple

使用条目插入元素

DoubleLinkedQueueEntry 允许相对于现有条目插入元素。

main.dart
import 'dart:collection';

void main() {
  var queue = DoubleLinkedQueue<String>();
  queue.add('Apple');
  queue.add('Cherry');

  // Get first entry
  var firstEntry = queue.firstEntry();

  // Insert before first entry
  firstEntry!.insertBefore('Apricot');

  // Insert after first entry
  firstEntry.insertAfter('Banana');

  print(queue);
}

我们在现有条目之前和之后插入元素。这提供了对队列位置的精确控制,而无需索引。

$ dart main.dart
{Apricot, Apple, Banana, Cherry}

使用条目删除元素

条目可以在保持结构的同时将自己从队列中删除。

main.dart
import 'dart:collection';

void main() {
  var queue = DoubleLinkedQueue<String>();
  queue.addAll(['Apple', 'Banana', 'Cherry', 'Date']);

  // Get second entry
  var secondEntry = queue.firstEntry()!.nextEntry();

  // Remove the entry
  var removedValue = secondEntry!.remove();

  print('Removed: $removedValue');
  print('Remaining queue: $queue');
}

remove() 方法会从队列中删除该条目并返回其值。队列会自动更新其链接以保持连续性。

$ dart main.dart
Removed: Banana
Remaining queue: {Apple, Cherry, Date}

遍历条目

我们可以使用条目导航方法来遍历队列。

main.dart
import 'dart:collection';

void main() {
  var queue = DoubleLinkedQueue<int>();
  queue.addAll([10, 20, 30, 40, 50]);

  // Start with first entry
  var current = queue.firstEntry();

  print('Forward traversal:');
  while (current != null) {
    print(current.value);
    current = current.nextEntry();
  }

  // Start with last entry
  current = queue.lastEntry();

  print('\nBackward traversal:');
  while (current != null) {
    print(current.value);
    current = current.previousEntry();
  }
}

这演示了使用条目导航对队列的双向遍历。我们可以向前或向后移动链接的结构。

$ dart main.dart
Forward traversal:
10
20
30
40
50

Backward traversal:
50
40
30
20
10

高级条目操作

条目可用于复杂的队列操作,例如重新排序。

main.dart
import 'dart:collection';

void main() {
  var queue = DoubleLinkedQueue<String>();
  queue.addAll(['A', 'B', 'C', 'D', 'E']);

  // Get middle entry
  var middle = queue.firstEntry()!.nextEntry()!.nextEntry();

  // Remove and reinsert at beginning
  middle!.remove();
  queue.firstEntry()!.insertBefore(middle.value);

  print('After moving middle to front: $queue');

  // Swap first and last
  var firstVal = queue.firstEntry()!.value;
  var lastVal = queue.lastEntry()!.value;

  queue.firstEntry()!.value = lastVal;
  queue.lastEntry()!.value = firstVal;

  print('After swapping first and last: $queue');
}

这展示了使用条目对队列元素进行的高级操作。我们通过条目引用移动一个元素并直接交换值。

$ dart main.dart
After moving middle to front: {C, A, B, D, E}
After swapping first and last: {E, A, B, D, C}

最佳实践

来源

Dart DoubleLinkedQueueEntry 文档

本教程介绍了 Dart 的 DoubleLinkedQueueEntry,并通过实际示例演示了其关键特性和用法模式。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 Dart 教程