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

Minimal Node.JS logger for 12-factor apps

A twelve-factor app never concerns itself with routing or storage of its output stream. It should not attempt to write to or manage logfiles. Instead, each running process writes its event stream, unbuffered, to stdout. During local... Continue →