function Node (element){ this.element = element; this.next = null; } function LinkedList(){ this.length = 0; this.head = null; } LinkedList.prototype = { //向表尾添加一个元素 append :function(element){ var node = new Node(element),current; if(this.head === null){ this.head = node; }else { current = this.head; while(current.next){ current = current.next; } current.next = node; } length++; }, //任意位置插入一个元素 insert :function(position,element){ if(position >= 0 && position <= length){ var node = new Node(element), current = this.head, previous, index = 0; if(position === 0 ){ node.next = current; this.head = node; } else { while(index ++ < position){ previous = current; current = current.next; } node.next = current; previous.next = node; } length++; return true; } else { return false; } }, //移除指定项 removeAt :function(position){ if(position>-1 && position <length){ var current = this.head, previous, index = 0; if(position === 0){ this.head = current.next; } else { while(index++ < position){ previous = current; current = current.next; } previous.next = current.next; } length--; return current.element; } else { return null; } }, //删除一个元素 tremove :function(element){ var index = this.indexOf(element); return this.removeAt(index); }, //查找元素的索引 indexOf :function(element){ var current = this.head, index = -1; while(current){ if(element === current.element){ return index; } index ++; current = current.next; } return -1; }, isEmpty :function(){ return length === 0; }, size :function(){ return length; }, //打印链表元素 toString :function(){ var current = this.head, string=''; while(current){ string += current.element + " "; current = current.next; } return string; }, getHead :function(){ return this.head; }, }; //test var list = new LinkedList(); list.append('a'); list.append('b'); list.append('c'); list.append('d'); console.log(list.toString()); list.insert('2','test'); console.log(list.toString()); /////////////////////////////////////////////////////////////////////////双向链表 function DoublyNode(element){ this.element = element; this.next = null; this.prev = null; }; function DoublyLinkedList(){ this.length = 0; this.head = null; this.tail = null; }; DoublyLinkedList.prototype = { insert:function(position,element){ //任意位置插入一个元素 if(position >= 0 && position <= this.length){ var node = new DoublyNode(element), current = this.head, previous, index = 0; if(position === 0){ //第一个位置添加 if(!this.head){ this.head = node; this.tail = node; } else { node.next = current; current.prev = node; this.head = node; } } else if(position === this.length){ //最后一项添加 current = this.tail; current.next = node; node.prev = current; this.tail = node; } else { while(index++ < position){ previous = current; current = current.next; } node.prev = previous; node.next = current; previous.next = node; current.prev = node; } length++; return true; } else { return false; } }, removeAt :function(position){ //任意位置移除元素 if(position > -1 && position < this.length){ var current = this.head, previous, index=0; if(position === 0){ //移除第一项 this.head = current.next; if(this.length === 1){ this.tail = null; } else { this.head.prev = null; } } else if(position === this.length-1){ //移除最后一项 current = this.tail; this.tail = current.prev; this.tail.next = null; } else { while(index++ < position){ previous = current; current = current.next; } previous.next = current.next; current.next.prev = previous; } this.length--; return current.element; } else { return null; } }, };