整個(gè)單向鏈表引用類(lèi)型的程序如下:
//節(jié)點(diǎn)應(yīng)用類(lèi)型
function Node(data){
this.data=data;
this.next=null;
}
//鏈表引用類(lèi)型
function List(){
//哨兵節(jié)點(diǎn)
this.head=new Node();
this.size=0;
}
List.prototype={
//在鏈表尾部添加節(jié)點(diǎn)
add: function(data){
var current=this.head;
while(current.next!=null){
current=current.next;
}
current.next=new Node(data);
this.size++;
},
//遍歷鏈表空免,不對(duì)鏈表元素操作都可以調(diào)用此方法
forEach: function(callback){
for(var current=this.head.next;current!=null;current=current.next){
callback(current.data);
}
},
//打印鏈表中所有元素
print: function(){
this.forEach(function(item){
console.log(item);
})
},
//查找鏈表元素的位置
indexOf: function(data){
var pos=0;
var current=this.head.next;
while(current!=null){
if(current.data===data){
break;
}
current=current.next;
pos++;
}
return pos;
},
/**
* 在位置pos處插入節(jié)點(diǎn)值為data
* 若成功則返回插入的值吧碾,若失敗則返回null
*/
insert: function(pos,data){
if(pos<0 || pos>this.size-1){
return null;
}
//插入位置的上一個(gè)節(jié)點(diǎn)
var last=this.head;
for(var i=0;i<pos;i++){
last=last.next;
}
//保存下一個(gè)節(jié)點(diǎn)的引用
var ready=last.next;
last.next=new Node(data);
last.next.next=ready;
this.size++;
return data;
},
/**
* 刪除指定位置的元素
* 若成功則返回刪除的值,若失敗則返回null
*/
removeAt: function(index){
if(index<0 || index>this.size-1){
return null;
}
var current=this.head.next;
var last=this.head;
for(var i=0;i<index;i++){
last=current;
current=current.next;
}
last.next=current.next;
this.size--;
return current.data;
},
//刪除相應(yīng)元素
remove: function(data){
var current=this.head.next;
var last=this.head;
while(current!=null){
if(current.data===data){
last.next=current.next;
//已刪除節(jié)點(diǎn)
this.size--;
break;
}
last=current;
current=current.next;
}
}
};
實(shí)現(xiàn)單向鏈表要注意的地方是,js沒(méi)有指針禾嫉,因此可以在最開(kāi)始創(chuàng)建一個(gè)哨兵節(jié)點(diǎn),它的next引用指向第一個(gè)節(jié)點(diǎn)蚊丐,這樣可以避免反復(fù)討論是否為第一個(gè)節(jié)點(diǎn)的情況熙参,但是這樣寫(xiě)就要主要每次循環(huán)的起點(diǎn)應(yīng)該是this.head.next
測(cè)試代碼如下:
var list=new List();
list.add(1);
list.add(2);
list.add(3);
list.insert(1,2);
console.log(list.indexOf(2)); //2
list.remove(3);
list.removeAt(1);
console.log(list.size); //2
list.print(); //1 2