Merge 49a86ecb31
into 4b6450ab84
commit
18f3394458
@ -0,0 +1,114 @@
|
|||||||
|
/*
|
||||||
|
* Doubly LinkedList with functionalities of
|
||||||
|
* add: Add node to list
|
||||||
|
* contains: Check if the list contains a certain value (Not a strict object comparison)
|
||||||
|
* getCurrentNode
|
||||||
|
* toString(): Prints the LinkedList representation
|
||||||
|
* next()
|
||||||
|
* previous()
|
||||||
|
*/
|
||||||
|
class Node {
|
||||||
|
constructor(_value) {
|
||||||
|
this.value = _value;
|
||||||
|
this.next = null;
|
||||||
|
this.previous = null;
|
||||||
|
}
|
||||||
|
setNext(_next) {
|
||||||
|
this.next = _next;
|
||||||
|
}
|
||||||
|
setPrevious(_previous) {
|
||||||
|
this.previous = _previous;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class LinkedList {
|
||||||
|
constructor() {
|
||||||
|
this.currentNode = null;
|
||||||
|
this.firstNode = null;
|
||||||
|
this.lastNode = null;
|
||||||
|
for (let i = 0; i < arguments.length; i++) {
|
||||||
|
this.add(arguments[i]);
|
||||||
|
}
|
||||||
|
// Update lastNode as currentNode after init.
|
||||||
|
this.currentNode = this.lastNode;
|
||||||
|
}
|
||||||
|
add(element) {
|
||||||
|
// Construct new node
|
||||||
|
let newNode = new Node(element);
|
||||||
|
// Update global list
|
||||||
|
this.update(newNode);
|
||||||
|
// Link up
|
||||||
|
if (this.lastNode) {
|
||||||
|
this.lastNode.setNext(newNode);
|
||||||
|
newNode.setPrevious(this.lastNode);
|
||||||
|
} else {
|
||||||
|
// Is first node
|
||||||
|
this.firstNode = newNode;
|
||||||
|
}
|
||||||
|
// Update currentNode
|
||||||
|
this.lastNode = newNode;
|
||||||
|
}
|
||||||
|
contains(element) {
|
||||||
|
if (this.globalList[element]) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Helper function to update global list
|
||||||
|
update(newNode) {
|
||||||
|
if (this.globalList) { // Has existing
|
||||||
|
this.globalList[newNode.value] = true;
|
||||||
|
} else {
|
||||||
|
// Brand new
|
||||||
|
this.globalList = {}
|
||||||
|
this.globalList[newNode.value] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getCurrentNode() {
|
||||||
|
return this.currentNode;
|
||||||
|
}
|
||||||
|
next() {
|
||||||
|
if (this.currentNode.next) {
|
||||||
|
this.currentNode = this.currentNode.next;
|
||||||
|
} else {
|
||||||
|
console.log('Already at end of linked list'); // Optionally, go back to first element if we want a doubly-circular linkedlist
|
||||||
|
}
|
||||||
|
}
|
||||||
|
previous() {
|
||||||
|
if (this.currentNode.previous) {
|
||||||
|
this.currentNode = this.currentNode.previous;
|
||||||
|
} else {
|
||||||
|
console.log('Already at start of linked list'); // Optionally, go back to first element if we want a doubly-circular linkedlist
|
||||||
|
}
|
||||||
|
}
|
||||||
|
toString() {
|
||||||
|
var nodeToPrint = this.firstNode;
|
||||||
|
var linkedListString = String(nodeToPrint.value);
|
||||||
|
while(nodeToPrint.next) {
|
||||||
|
nodeToPrint = nodeToPrint.next;
|
||||||
|
linkedListString += "->";
|
||||||
|
linkedListString += String(nodeToPrint.value);
|
||||||
|
}
|
||||||
|
return linkedListString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Tests */
|
||||||
|
var list = new LinkedList(1,2,3); // New DoublyLinkedList constructed with value 1->2->3
|
||||||
|
console.log(list.toString()); // Prints '1->2->3'
|
||||||
|
list.contains(2); // returns true
|
||||||
|
list.contains(4); // returns false
|
||||||
|
console.log(list.currentNode.value); // Returns 3
|
||||||
|
list.previous(); // Pointer moves back by 1
|
||||||
|
console.log(list.currentNode.value); // Returns 2
|
||||||
|
list.next(); // Pointer moves forward by 1
|
||||||
|
console.log(list.currentNode.value); // Returns 3
|
||||||
|
list.next(); // Pointer moves forward by 1, but already at end of list. 'Already at end of linked list' logs to console.
|
||||||
|
list.previous(); // Pointer moves back by 1
|
||||||
|
list.previous(); // Pointer moves back by 1
|
||||||
|
console.log(list.currentNode.value); // Returns 1
|
||||||
|
list.previous(); // Pointer moves back by 1, but already at start of list. 'Already at start of linked list' logs to console.
|
||||||
|
list.add(4); // List is now 1->2->3->4
|
||||||
|
list.contains(4); // returns true
|
||||||
|
console.log(list.toString()); // Prints '1->2->3->4'
|
Loading…
Reference in new issue