# Linked List > Singly linked list.
## Usage ```javascript var linkedList = require( '@stdlib/utils/linked-list' ); ``` #### linkedList() Returns a new linked list instance. ```javascript var list = linkedList(); // returns ``` ##### list.clear() Clears a list. ```javascript var list = linkedList(); // returns // 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`. ```javascript var list = linkedList(); // returns // 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 ) Inserts a `value` into the list **after** a provided list `node`. ```javascript var list = linkedList(); // returns // 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 ``` ##### list.iterator() Returns an iterator for iterating over a list. If an environment supports `Symbol.iterator`, the returned iterator is iterable. ```javascript var list = linkedList(); // 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 ``` **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`. ```javascript var list = linkedList(); // returns // 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. ```javascript var list = linkedList(); // 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`. ```javascript var list = linkedList(); // 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. ```javascript var list = linkedList(); // 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. ```javascript var list = linkedList(); // 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`. ```javascript var list = linkedList(); // 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. ```javascript var list = linkedList(); // 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. ```javascript var list = linkedList(); // Add values to the list: list.push( 'foo' ).push( 'bar' ); // Serialize to JSON: var o = list.toJSON(); // returns { 'type': '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. ```javascript var list = linkedList(); // 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' ```
## Examples ```javascript var linkedList = require( '@stdlib/utils/linked-list' ); var list; var iter; var len; var v; var i; // Create a new linked list: list = linkedList(); // 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 ```