Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kessler/digital-chain
A linked list implementation
https://github.com/kessler/digital-chain
data-structures javascript nodejs nodejs-modules npm-package
Last synced: about 2 months ago
JSON representation
A linked list implementation
- Host: GitHub
- URL: https://github.com/kessler/digital-chain
- Owner: kessler
- License: mit
- Created: 2015-05-27T16:28:04.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2022-05-13T17:46:02.000Z (over 2 years ago)
- Last Synced: 2024-10-20T09:23:01.463Z (3 months ago)
- Topics: data-structures, javascript, nodejs, nodejs-modules, npm-package
- Language: JavaScript
- Homepage:
- Size: 29.3 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# digital-chain [![stable](http://badges.github.io/stability-badges/dist/stable.svg)](http://github.com/badges/stability-badges)
A linked list implementation
## API
#### Table of Contents
* [LinkedList](#linkedlist)
* [length](#length)
* [push](#push)
* [Parameters](#parameters)
* [pushAll](#pushall)
* [Parameters](#parameters-1)
* [pop](#pop)
* [unshift](#unshift)
* [Parameters](#parameters-2)
* [unshiftAll](#unshiftall)
* [Parameters](#parameters-3)
* [shift](#shift)
* [remove](#remove)
* [Parameters](#parameters-4)
* [swap](#swap)
* [Parameters](#parameters-5)
* [sort](#sort)
* [Parameters](#parameters-6)
* [nodes](#nodes)
* [values](#values)
* [iterator](#iterator)
* [iterator](#iterator-1)
* [reverseIterator](#reverseiterator)
* [findFirst](#findfirst)
* [Parameters](#parameters-7)
* [findAll](#findall)
* [Parameters](#parameters-8)
* [findFirstBy](#findfirstby)
* [Parameters](#parameters-9)
* [findAllBy](#findallby)
* [Parameters](#parameters-10)
* [nodeIterator](#nodeiterator)
* [EntryIterator](#entryiterator)
* [Parameters](#parameters-11)
* [ValueIterator](#valueiterator)
* [Parameters](#parameters-12)
* [NodeIterator](#nodeiterator-1)
* [Parameters](#parameters-13)
* [ListNode](#listnode)
* [Parameters](#parameters-14)### LinkedList
a doubly linked list
#### length
returns the current length of the list
#### push
push an item to the tail of this list
##### Parameters
* `item` **Variant** any kind of item can be pushed
Returns **[ListNode](#listnode)** the node wrapping the item, nodes can be used in methods such as remove()
#### pushAll
push all the items at the tail of the list
the following are equivalent:```js
list.pushAll(1, 2, 3)
list.pushAll([1, 2], 3)
list.pushAll([1, 2, 3])
```to push an array as a single item use .push(arr)
##### Parameters
* `args` **...\[Variant]** an array or just arguments to be pushed to the list
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ListNode](#listnode)>**
#### pop
remove the tail of this list, if the list has more than 1 node in it, the previous node
will become the new tail of the listReturns **Variant** the data from the removed tail node or `undefined` if the list was empty
#### unshift
insert an item at the head of this list
##### Parameters
* `item` **Variant** any kind of item can be inserted
Returns **[ListNode](#listnode)**
#### unshiftAll
insert all the items at the head of the list
the following are all equivalent:```js
list.unshiftAll(1, 2, 3)
list.unshiftAll([1, 2], 3)
list.unshiftAll([1, 2, 3])
```to push an array as a single item use .push(arr)
##### Parameters
* `args` **...\[Variant]** an array or just arguments to be pushed to the list
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ListNode](#listnode)>**
#### shift
remove the head of this list, if the list has more than 1 node in it, the next node
will become the new head of the listReturns **Variant** the data from the removed head node or `undefined` if the list was empty
#### remove
Remove a node from the list
##### Parameters
* `node` **[ListNode](#listnode)** the node to remove
Returns **Variant** the data contained in the removed node
#### swap
swap the positions of node A and node B inside the list
this method will throw an error if one or more of the arguments is not a `Node` or not a member
of this list##### Parameters
* `nodeA` **[ListNode](#listnode)**
* `nodeB` **[ListNode](#listnode)**Returns **[Boolean](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** returns true if a swap did occur
#### sort
sort the list
the default sorting comparator is:
```js
function defaultComparator(a, b) {
if (b > a) return -1
if (b < a) return 1
return 0
}
```##### Parameters
* `comparator` **function ([Node](https://developer.mozilla.org/docs/Web/API/Node/nextSibling), [Node](https://developer.mozilla.org/docs/Web/API/Node/nextSibling))?** override the default comparator with a custom one.
#### nodes
An ES6 iterator of the nodes in this list, starting from the head
```js
for (let node of list.nodes()) {
console.log(node.data, node.next)
}
```Returns **[NodeIterator](#nodeiterator)**
#### values
An ES6 iterator of the values in this list, starting from the head
```js
for (let value of list.values()) {
console.log(value)
}
```Returns **[ValueIterator](#valueiterator)**
#### iterator
An ES6 iterator of the value and nodes in this list, starting from the head
```js
for (let [data, node] of list) {
console.log(data === node.data)
}
```Returns **[EntryIterator](#entryiterator)**
#### iterator
A functional iterator over the values in the list, prefer the new ES6 iteration methods over this
#### reverseIterator
An ES6 iterator of the value and nodes in this list, starting from the *tail*
Returns **[EntryIterator](#entryiterator)**
#### findFirst
find the first occurrence of this piece of data in the list, equality test
is performed using `===`##### Parameters
* `data` **Variant** data to find
Returns **[ListNode](#listnode)** the first node that contains this data
#### findAll
find all the occurrences of this piece of data in the list, equality test
is performed using `===`
this will traverse the entire list##### Parameters
* `data` **Variant** data to find
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ListNode](#listnode)>** an array of nodes that contain this data
#### findFirstBy
finds the first node in the list where the predicate function returns `true`
##### Parameters
* `predicate` **function (Variant)** a function that returns `true` for nodes that should be included in the search results
Returns **[ListNode](#listnode)** the first node that was found
#### findAllBy
finds the all the nodes in the list where the predicate function returns `true`
##### Parameters
* `predicate` **function (Variant)** a function that returns `true` for nodes that should be included in the search results
Returns **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)<[ListNode](#listnode)>** an array of nodes that were found
#### nodeIterator
A functional iterator over the nodes in the list, prefer the new ES6 iteration methods over this
### EntryIterator
Implements iteration over the list's entries (pairs of value + it's hosting node).
This iterator is the only iterator that can change it's direction, the others are
provided for convenience and only iterate from head to tail.```js
const list = new LinkedList()
// iterate from head to tail
for (const [value, node] of list) { ... }// iterate from tail to head
for (const [value, node] of list.reverseIterator()) { ... }
```#### Parameters
* `list`
* `direction`### ValueIterator
**Extends EntryIterator**
Implements iteration over the list's values.
```js
const list = new LinkedList()
// iterate from head to tail
for (const value of list.values()) { ... }```
#### Parameters
* `list`
### NodeIterator
**Extends EntryIterator**
Implements iteration over the list's nodes.
```js
const list = new LinkedList()
// iterate from head to tail
for (const node of list.nodes()) { ... }```
#### Parameters
* `list`
### ListNode
a node in the list
#### Parameters
* `data`
* `parent`## Extension
This implemenation uses several internal classes for iteration and for "hosting" values.
### EntryIterator, ValueIterator, NodeIterator and ListNode
These classes can be customized via inheritance:
```js
const LinkedList = require('digital-chain')class MyEntryIterator extends LinkedList.EntryIterator {}
class MyValueIterator extends LinkedList.ValueIterator {}
class MyNodeIterator extends LinkedList.NodeIterator {}
class MyListNode extends LinkedList.ListNode {}```
These new classes can then be incorporated into the linked list's by overriding their respective factory methods:
```js
class MyLinkedList extends LinkedList {
_newEntryIterator(list, direction) {
return new MyEntryIterator(list, direction) // direction constants are LinkedList.FROM_HEAD or LinkedList.FROM_TAIL
}_newValueIterator(list) {
return new MyValueIterator(list)
}_newNodeIterator(list) {
return new MyNodeIterator(list)
}_newListNode(data, parent) {
return new MyListNode(data, parent)
}
}// of course this can also be done to an existing instance:
const customList = new LinkedList()
customList._newEntryIterator = (list, direction) => new MyEntryIterator(list, direction)```
## docs
documentation readme index.js --section=API