10 KiB
Doubly Linked List
Doubly linked list constructor.
Usage
var doublyLinkedList = require( '@stdlib/utils/doubly-linked-list' );
doublyLinkedList()
Returns a new doubly linked list instance.
var list = doublyLinkedList();
// returns <DoublyLinkedList>
list.clear()
Clears a list.
var list = doublyLinkedList();
// returns <DoublyLinkedList>
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Peek at the first value:
var v = list.first().value;
// returns 'foo'
// Examine the list length:
var len = list.length;
// returns 2
// Clear all list items:
list.clear();
// Peek at the first value:
v = list.first();
// returns undefined
// Examine the list length:
len = list.length;
// returns 0
list.first()
Returns the first node
. If the list is currently empty, the returned value is undefined
.
var list = doublyLinkedList();
// returns <DoublyLinkedList>
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Peek at the first value:
var v = list.first().value;
// returns 'foo'
list.insert( node, value[, location] )
Inserts a value
into the list either before or after a provided list node
.
var list = doublyLinkedList();
// returns <DoublyLinkedList>
// Add values to the list:
list.push( 'foo' ).push( 'bar' ).push( 'beep' );
// Determine the list length:
var len = list.length;
// returns 3
// Get the second node:
var node = list.first().next;
// Insert a value after the second node:
list.insert( node, 'boop' );
// Determine the list length:
len = list.length;
// returns 4
// Return a list of values:
var values = list.toArray();
// returns [ 'foo', 'bar', 'boop', 'beep' ]
The method supports the following insertion locations:
'before'
: insert avalue
into the list before a provided listnode
.'after'
: insert avalue
into the list after a provided listnode
.
By default, the method inserts a value
into the list after a provided list node
. To insert a value before a provided list node
, invoke the method with the location
argument equal to 'before'
.
var list = doublyLinkedList();
// returns <DoublyLinkedList>
// Add values to the list:
list.push( 'foo' ).push( 'bar' ).push( 'beep' );
// Determine the list length:
var len = list.length;
// returns 3
// Get the second node:
var node = list.first().next;
// Insert a value before the second node:
list.insert( node, 'boop', 'before' );
// Determine the list length:
len = list.length;
// returns 4
// Return a list of values:
var values = list.toArray();
// returns [ 'foo', 'boop', 'bar', 'beep' ]
list.iterator( [direction] )
Returns an iterator for iterating over a list. If an environment supports Symbol.iterator
, the returned iterator is iterable.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Create an iterator:
var it = list.iterator();
// Iterate over the list...
var v = it.next().value;
// returns 'foo'
v = it.next().value;
// returns 'bar'
var bool = it.next().done;
// returns true
The method supports the following iteration directions:
'forward'
: iterate over a list from the first value until the last value.'reverse'
: iterate over a list from the last value until the first value.
By default, the method returns an iterator which iterates over a list from the first value until the last value. To return an iterator which iterates in reverse order, invoke the method with the direction
argument equal to 'reverse'
.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Create an iterator:
var it = list.iterator( 'reverse' );
// Iterate over the list...
var v = it.next().value;
// returns 'bar'
v = it.next().value;
// returns 'foo'
var bool = it.next().done;
// returns true
Note: in order to prevent confusion arising from list mutation during iteration, a returned iterator always iterates over a list "snapshot", which is defined as the list of list elements at the time of list.iterator()
invocation.
list.last()
Returns the last node
. If the list is currently empty, the returned value is undefined
.
var list = doublyLinkedList();
// returns <DoublyLinkedList>
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Peek at the last value:
var v = list.last().value;
// returns 'bar'
list.length
List length.
var list = doublyLinkedList();
// Examine the initial list length:
var len = list.length;
// returns 0
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Retrieve the current list length:
len = list.length;
// returns 2
list.pop()
Removes a value from the end of the list. If the list is currently empty, the returned value is undefined
.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Remove the last value:
var v = list.pop();
// returns 'bar'
// Add a new value to the list:
list.push( 'beep' );
// Remove the last value:
v = list.pop();
// returns 'beep'
list.push( value )
Adds a value to the end of the list.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Remove the last value:
var v = list.pop();
// returns 'bar'
// Add a new value to the list:
list.push( 'beep' );
// Remove the last value:
v = list.pop();
// returns 'beep'
list.remove( node )
Removes a node
from the list.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' ).push( 'beep' );
// Determine the list length:
var len = list.length;
// returns 3
// Get the second node:
var node = list.first().next;
// Remove the second node:
var v = list.remove( node );
// returns 'bar'
// Determine the list length:
len = list.length;
// returns 2
list.shift()
Removes a value from the beginning of the list. If the list is currently empty, the returned value is undefined
.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Remove the first value:
var v = list.shift();
// returns 'foo'
// Add a new value to the list:
list.push( 'beep' );
// Remove the first value:
v = list.shift();
// returns 'bar'
list.toArray()
Returns an array of list values.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Get an array of list values:
var vals = list.toArray();
// returns [ 'foo', 'bar' ]
list.toJSON()
Serializes a list as JSON.
var list = doublyLinkedList();
// Add values to the list:
list.push( 'foo' ).push( 'bar' );
// Serialize to JSON:
var o = list.toJSON();
// returns { 'type': 'doubly-linked-list', 'data': [ 'foo', 'bar' ] }
Note: JSON.stringify()
implicitly calls this method when stringifying a list instance.
list.unshift( value )
Adds a value to the beginning of the list.
var list = doublyLinkedList();
// Add values to the list:
list.unshift( 'foo' ).unshift( 'bar' );
// Remove the last value:
var v = list.pop();
// returns 'foo'
// Add a new value to the list:
list.unshift( 'beep' );
// Remove the last value:
v = list.pop();
// returns 'bar'
Notes
-
To manually traverse a list, use list node
next
andprev
properties.var list = doublyLinkedList(); // Add values to the list: list.push( 'foo' ).push( 'bar' ).push( 'beep' ).push( 'boop' ); // Get the first list node: var n = list.first(); // Walk the list forward... while ( n ) { console.log( n.value ); n = n.next; } // Get the last list node: n = list.last(); // Walk the list backward... while ( n ) { console.log( n.value ); n = n.prev; }
Examples
var doublyLinkedList = require( '@stdlib/utils/doubly-linked-list' );
var list;
var iter;
var len;
var v;
var i;
// Create a new doubly linked list:
list = doublyLinkedList();
// Add some values to the list:
list.push( 'foo' );
list.push( 'bar' );
list.push( 'beep' );
list.push( 'boop' );
// Peek at the first and last list values:
v = list.first().value;
// returns 'foo'
v = list.last().value;
// returns 'boop'
// Inspect the list length:
len = list.length;
// returns 4
// Remove the last list value:
v = list.pop();
// returns 'boop'
// Inspect the list length:
len = list.length;
// returns 3
// Iterate over the list:
iter = list.iterator();
for ( i = 0; i < len; i++ ) {
console.log( 'List value #%d: %s', i+1, iter.next().value );
}
// Clear the list:
list.clear();
// Inspect the list length:
len = list.length;
// returns 0