Lista vinculada sem uma única instrução if? – Desafio aceito!

// 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, na verdade existe uma instrução if lá, mas ainda é bastante elegante.