[フレーム]
Last Updated: February 25, 2016
·
572
· alexanderg

Linked List without a single if-statement? - Challenge accepted!

// PoC: Implemented methods: addToTail(value), removeHead() #=> value, contains(value) #=> boolean

var tail = {
 next: this,
 removeHead: function () {
 return null;
 },
 contains: function (value) {
 return false;
 },
 addToTail: function (value) {
 return new Node(value);
 }
};

var Node = function (value, next) {
 this.value = value;
 this.next = next || tail;
};

Node.prototype.addToTail = function (value) {
 this.next = this.next.addToTail(value);
 return this;
};

Node.prototype.contains = function (value) {
 // Ok, condition...
 return this.value === value ? true : this.next.contains(value);
};

var LinkedList = function () {
 this.head = tail;
};

LinkedList.prototype.addToTail = function (value) {
 this.head = this.head.addToTail(value);
};

LinkedList.prototype.removeHead = function () {
 var oldHead = this.head;
 this.head = oldHead.next;
 return oldHead.value;
};

LinkedList.prototype.contains = function (value) {
 return this.head.contains(value);
};


//// Example:
var linkedList = new LinkedList();
linkedList.addToTail(1);
linkedList.addToTail(2);
linkedList.addToTail(3);
console.log('true!', linkedList.contains(1));
console.log('true!', linkedList.contains(2));
console.log('true!', linkedList.contains(3));
console.log('1!', linkedList.removeHead());
console.log('false!', linkedList.contains(1));
console.log('true!', linkedList.contains(2));
console.log('true!', linkedList.contains(3));

Ok, there is actually one if-statement in there, but it's still quite elegant.

AltStyle によって変換されたページ (->オリジナル) /