function LinkedList(){
var Node = function(element){
this.element = element;
this.next = null;
}
var length = 0;
var head = null;
//在链表尾部增加元素
this.append = function(element){
var node = new Node(element),current;
if(head == null){
head = node;
}else{
current = head;
while(current.next){
current = current.next;
}
current.next = node;
}
length++;
};
//在链表中增加元素
this.insert = function(position, element){
if(position>-1&&position<length){
var node = new Node(element), current = head,previous,index = 0;
if(position === 0){
node.next = current;
head = node;
}else{
while(index++ < position){
previous = current;
current = current.next;
}
previous.next = node;
node.next = current;
}
length++;
return true;
}else{
return false;
}
};
//从列表的特定位置移除一项
this.removeAt = function(position){
if(position>-1&&position<length){
var current = head,previous,index=0;
if(position === 0){
head = current.next;
}else{
while(index++ < position){
previous = current;
current = current.next;
}
previous.next = current.next;
}
length--;
return current.element;
}else{
return null;
}
};
//从列表中移除一项。
this.remove = function(element){
var index = this.indexOf(element);
return this.removeAt(index);
};
//返回元素在列表中的索引。如果列表中没有该元素则返回 -1
this.indexOf = function(element){
var current = head,index = 0;
while(current){
if(element == current.element){
return index;
}
current = current.next;
index++;
}
return -1;
};
//如果链表中不包含任何元素,返回 true ,如果链表长度大于0则返回 false
this.isEmpty = function() {
return length === 0;
};
//返回链表包含的元素个数。与数组的 length 属性类似。
this.size = function() {
return length;
};
//由于列表项使用了 Node 类,就需要重写继承自JavaScript对象默认的
this.toString = function(){
var current = head,string = '';
while(current){
string = current.element;
current = current.next;
}
return string;
};
this.getHead = function(){
return head;
};
//
this.print = function(){
var current = head,previous,index=0,items = [];
if(length===0){
return null;
}else{
while(current){
items.push(current.element);
console.log(current.element);
current = current.next;
}
console.log(items);
return items;
}
};
}
function DoublyLinkedList() {
var Node = function(element){
this.element = element;
this.pre = null;
this.next = null;
}
var length = 0;
var head = null;
var tail = null; //新增的
this.insert = function(position, element){
if(position>-1&&position<length){
var node = new Node(element), current = head,previous,index = 0;
if(position === 0){
if(!head){
head = node;
tail = node;
}else{
node.next = current;
current.pre = node;
node = head;
}
}else if(position === length){
current = tail;
current.next = node;
node.pre = current;
tail = node;
}else{
while(index++<position){
previous = current;
current = current.next;
}
node.pre = previous;
previous.next = node;
node.next = current.next;
}
return true;
}
return false;
}
this.removeAt = function(position){
//检查越界值
if (position > -1 && position < length){
var current = head,previous,index = 0;
if(position === 0){
head = current.next;
if(length === 1){
tail = null;
}else{
head.pre = null;
}
}else if(position === length){
current = tail;
tail = current.pre;
tail.next = null;
}else{
while(index++ position){
previous = current;
current = current.next;
}
previous.next = current.next;
current.next.pre = previous;
}
length--;
return current.element;
}
return null;
}
}