双向链表
双向链表的 remove() 方法比单向链表的效率更高,因为不需要再查找前驱节点了
//创建构造函数创建节点
function Node(element){
this.element = element;
this.next = null;
this.previous = null;
this.findLast = findLast;
this.disPreverse = disPreverse;
}
//链表的构造函数
function LList(){
this.head = new Node('head');
this.insert = insert;
this.remove = remove;
this.display = display;
this.find = find;
}
function insert(newElement,item){
var cur = this.find(item);
var node = new Node(newElement);
if(cur == null){
alert('没有找到插入位置');
}else{
node.next = cur.next;
node.previous = cur;
cur.next = node;
}
}
function find(item){
var cur = this.head;
while(cur.element != item){
cur = cur.next;
}
return cur;
}
function display() {
var cur = this.head;
var str = '';
while (cur.next != null){
str += cur.next.element+'->';
cur = cur.next;
}
return str;
}
function remove(item){
var cur = this.find(item);
if(cur.next != null){
cur.previous.next = cur.next;
cur.next.previous = cur.previous;
cur.next = null;
cur.previous = null;
}else{
//注意,当节点的后继为null时不要设置cur.next.previous = cur.previous
//因为双向链表中null时没有前驱的,不能设置null的前驱
cur.previous.next = null;
}
}
//查找最后一个节点
function findLast(){
var cur = this.head;
while(cur.next != null){
cur = cur.next;
}
return cur;
}
//反序输出节点
function disPreverse(){
//注意,findLast()即使没有参数也要带括号
//如果不带括号,last则是一个function对象
var last = this.findLast();
//console.log(last);
var str = '';
while(last.previous != null){
str += last.element+'->';
last = last.previous;
}
return str;
}