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 one if-statement in there, but it’s elegant nevertheless.

 
4
Kudos
 
4
Kudos

Now read this

Simple Domainhacks using Node.JS

Coming up with good domain names is hard. This Node.JS script takes the hassle out of finding them by using the built in dictionary, which is available on every mac by default. Simply define the top level domains you want the script to... Continue →