Last active
August 29, 2015 14:11
-
-
Save BlackthornYugen/fefc027e1c80fe8b2268 to your computer and use it in GitHub Desktop.
// source https://jsbin.com/cidipo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function LinkList(){ | |
var _first = null; | |
var _last = null; | |
var _length = 0; | |
this.add = function(element){ | |
if(_length === 0){ | |
_last = _first = {element: element, prev:null, next:null}; | |
} else { | |
_last = _last.next = {element: element, prev: _last, next:null}; | |
} | |
return ++_length; | |
}; | |
this.pop = function(){ | |
var listItem = _first; | |
if(listItem === null){ | |
return null; | |
} | |
_first = _first.next; | |
if(_first) { | |
_first.prev = null; | |
} | |
_length--; | |
return listItem.element; | |
}; | |
var selectAt = function(index) { | |
if(index < 0 || index >= _length){ | |
return null; | |
} | |
var steps; | |
var pointer; | |
if(index < _length / 2){ | |
steps = index; | |
pointer = _first; | |
while(steps > 0 && pointer !== null){ | |
pointer = pointer.next; | |
steps--; | |
} | |
} else { | |
steps = _length - index - 1; | |
pointer = _last; | |
while(steps > 0 && pointer !== null){ | |
pointer = pointer.prev; | |
steps--; | |
} | |
} | |
return pointer; | |
}; | |
this.getElementByIndex = function(index){ | |
var selection = selectAt(index); | |
return selection !== null ? selection.element : null; | |
}; | |
this.getObjectByIndex = function(index){ | |
return selectAt(index); | |
}; | |
this.recount = function(){ | |
var length = 0; | |
var pointer = _first; | |
while(pointer !== null){ | |
length++; | |
pointer = pointer.next; | |
} | |
return length; | |
}; | |
Object.defineProperty(this, 'length', { | |
get: function(){ | |
return _length; | |
} | |
}); | |
Object.defineProperty(this, 'firstObject', { | |
get: function(){ | |
return _first; | |
} | |
}); | |
Object.defineProperty(this, 'lastObject', { | |
get: function(){ | |
return _last; | |
} | |
}); | |
} | |
// TESTS // | |
console.log("Tests"); | |
function test(name, expression){ | |
var result = expression ? "Pass" : "Fail"; | |
if(!expression && console.error){ | |
console.error(name + ": " + result); | |
} else { | |
console.log(name + ": " + result); | |
} | |
} | |
linkList = new LinkList(); | |
linkList.add(30); | |
test("Pop the 30", linkList.pop() === 30); | |
test("Pop null", linkList.pop() === null); | |
linkList.add(20); | |
linkList.add(10); | |
test("Pop the 20", linkList.pop() === 20); | |
test("First Prev Null", linkList.firstObject.prev === null); | |
test("Pop the 10", linkList.pop() === 10); | |
for(var i=0; i<10; i++) | |
{ | |
linkList.add(i); | |
} | |
test("index 4 is 4", linkList.getElementByIndex(4) === 4); | |
test("index 6 is 6", linkList.getElementByIndex(6) === 6); | |
test("object 6 is 4.next.next", linkList.getObjectByIndex(6) === linkList.getObjectByIndex(4).next.next); | |
test("object 4 is 6.prev.prev", linkList.getObjectByIndex(4) === linkList.getObjectByIndex(6).prev.prev); | |
test("last is 9", linkList.getObjectByIndex(0) === linkList.firstObject); | |
test("first is 0", linkList.getObjectByIndex(9) === linkList.lastObject); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment