Dart DoubleLinkedQueue
last modified April 4, 2025
In Dart, DoubleLinkedQueue is a double-ended queue implementation. It allows efficient insertion and removal at both ends.
DoubleLinkedQueue implements the Queue interface and maintains element order. It uses linked nodes internally for O(1) operations at both ends.
Creating a DoubleLinkedQueue
The simplest way to create a DoubleLinkedQueue is using the constructor.
import 'dart:collection'; void main() { var queue = DoubleLinkedQueue<String>(); queue.addFirst('Apple'); queue.addLast('Banana'); queue.addLast('Orange'); print(queue); }
We create a DoubleLinkedQueue of strings. We add elements to both ends using addFirst and addLast. The queue maintains insertion order.
$ dart main.dart DoubleLinkedQueue(Apple, Banana, Orange)
Basic Queue Operations
DoubleLinkedQueue provides standard queue operations at both ends.
import 'dart:collection'; void main() { var queue = DoubleLinkedQueue<int>(); queue.addAll([10, 20, 30]); print('First element: ${queue.first}'); print('Last element: ${queue.last}'); queue.removeFirst(); queue.removeLast(); print('After removals: $queue'); }
We demonstrate basic operations. addAll adds multiple elements. first and last access ends. removeFirst and removeLast modify the queue.
$ dart main.dart First element: 10 Last element: 30 After removals: DoubleLinkedQueue(20)
Iterating Through Queue
DoubleLinkedQueue supports various iteration methods.
import 'dart:collection'; void main() { var queue = DoubleLinkedQueue.of(['Red', 'Green', 'Blue']); print('Standard iteration:'); for (var color in queue) { print(color); } print('\nReversed iteration:'); for (var color in queue.reversed) { print(color); } }
We create a queue from an iterable using of. We iterate forward and backward. The reversed property provides elements in reverse order.
$ dart main.dart Standard iteration: Red Green Blue Reversed iteration: Blue Green Red
Queue Manipulation
DoubleLinkedQueue provides methods for complex manipulations.
import 'dart:collection'; void main() { var queue = DoubleLinkedQueue<int>(); queue.addAll([1, 2, 3, 4, 5]); queue.addFirst(0); queue.addLast(6); queue.removeWhere((element) => element % 2 == 0); print('Final queue: $queue'); print('Length: ${queue.length}'); }
We demonstrate adding elements to both ends. removeWhere filters elements. The queue maintains order through all operations.
$ dart main.dart Final queue: DoubleLinkedQueue(0, 1, 3, 5) Length: 4
Converting to Other Collections
DoubleLinkedQueue can be converted to other collection types.
import 'dart:collection'; void main() { var queue = DoubleLinkedQueue.of(['a', 'b', 'c']); var list = queue.toList(); var set = queue.toSet(); print('List: $list'); print('Set: $set'); var newQueue = DoubleLinkedQueue.from(queue.reversed); print('Reversed queue: $newQueue'); }
We convert the queue to a List and Set. We create a new queue from the reversed original. All conversions preserve element order.
$ dart main.dart List: [a, b, c] Set: {a, b, c} Reversed queue: DoubleLinkedQueue(c, b, a)
Best Practices
- Use for double-ended operations: Prefer for frequent front/back access.
- Avoid random access: Not optimized for middle element access.
- Consider ListQueue: For mostly single-end operations.
- Thread safety: Like all Dart collections, not thread-safe.
Source
Dart DoubleLinkedQueue Documentation
This tutorial covered Dart's DoubleLinkedQueue with practical examples demonstrating its key features and usage patterns.
Author
List all Dart tutorials.