summaryrefslogtreecommitdiff
path: root/lib/internal/DoublyLinkedList.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/internal/DoublyLinkedList.js')
-rw-r--r--lib/internal/DoublyLinkedList.js139
1 files changed, 71 insertions, 68 deletions
diff --git a/lib/internal/DoublyLinkedList.js b/lib/internal/DoublyLinkedList.js
index 86c5cfd..259ac0d 100644
--- a/lib/internal/DoublyLinkedList.js
+++ b/lib/internal/DoublyLinkedList.js
@@ -2,86 +2,89 @@
// used for queues. This implementation assumes that the node provided by the user can be modified
// to adjust the next and last properties. We implement only the minimal functionality
// for queue support.
-export default function DLL() {
- this.head = this.tail = null;
- this.length = 0;
-}
-
-function setInitial(dll, node) {
- dll.length = 1;
- dll.head = dll.tail = node;
-}
+export default class DLL {
+ constructor() {
+ this.head = this.tail = null;
+ this.length = 0;
+ }
-DLL.prototype.removeLink = function(node) {
- if (node.prev) node.prev.next = node.next;
- else this.head = node.next
- if (node.next) node.next.prev = node.prev;
- else this.tail = node.prev;
+ removeLink(node) {
+ if (node.prev) node.prev.next = node.next;
+ else this.head = node.next
+ if (node.next) node.next.prev = node.prev;
+ else this.tail = node.prev;
- node.prev = node.next = null;
- this.length -= 1;
- return node;
-}
+ node.prev = node.next = null;
+ this.length -= 1;
+ return node;
+ }
-DLL.prototype.empty = function () {
- while(this.head) this.shift();
- return this;
-};
+ empty () {
+ while(this.head) this.shift();
+ return this;
+ }
-DLL.prototype.insertAfter = function(node, newNode) {
- newNode.prev = node;
- newNode.next = node.next;
- if (node.next) node.next.prev = newNode;
- else this.tail = newNode;
- node.next = newNode;
- this.length += 1;
-}
+ insertAfter(node, newNode) {
+ newNode.prev = node;
+ newNode.next = node.next;
+ if (node.next) node.next.prev = newNode;
+ else this.tail = newNode;
+ node.next = newNode;
+ this.length += 1;
+ }
-DLL.prototype.insertBefore = function(node, newNode) {
- newNode.prev = node.prev;
- newNode.next = node;
- if (node.prev) node.prev.next = newNode;
- else this.head = newNode;
- node.prev = newNode;
- this.length += 1;
-}
+ insertBefore(node, newNode) {
+ newNode.prev = node.prev;
+ newNode.next = node;
+ if (node.prev) node.prev.next = newNode;
+ else this.head = newNode;
+ node.prev = newNode;
+ this.length += 1;
+ }
-DLL.prototype.unshift = function(node) {
- if (this.head) this.insertBefore(this.head, node);
- else setInitial(this, node);
-};
+ unshift(node) {
+ if (this.head) this.insertBefore(this.head, node);
+ else setInitial(this, node);
+ }
-DLL.prototype.push = function(node) {
- if (this.tail) this.insertAfter(this.tail, node);
- else setInitial(this, node);
-};
+ push(node) {
+ if (this.tail) this.insertAfter(this.tail, node);
+ else setInitial(this, node);
+ }
-DLL.prototype.shift = function() {
- return this.head && this.removeLink(this.head);
-};
+ shift() {
+ return this.head && this.removeLink(this.head);
+ }
-DLL.prototype.pop = function() {
- return this.tail && this.removeLink(this.tail);
-};
+ pop() {
+ return this.tail && this.removeLink(this.tail);
+ }
-DLL.prototype.toArray = function () {
- var arr = Array(this.length);
- var curr = this.head;
- for(var idx = 0; idx < this.length; idx++) {
- arr[idx] = curr.data;
- curr = curr.next;
+ toArray () {
+ var arr = Array(this.length);
+ var curr = this.head;
+ for(var idx = 0; idx < this.length; idx++) {
+ arr[idx] = curr.data;
+ curr = curr.next;
+ }
+ return arr;
}
- return arr;
-}
-DLL.prototype.remove = function (testFn) {
- var curr = this.head;
- while(!!curr) {
- var next = curr.next;
- if (testFn(curr)) {
- this.removeLink(curr);
+ remove (testFn) {
+ var curr = this.head;
+ while(curr) {
+ var next = curr.next;
+ if (testFn(curr)) {
+ this.removeLink(curr);
+ }
+ curr = next;
}
- curr = next;
+ return this;
}
- return this;
}
+
+function setInitial(dll, node) {
+ dll.length = 1;
+ dll.head = dll.tail = node;
+}
+