<!doctype html>
<head>
<meta charset = "utf-8" />
</head>
<body>
<script>
//单链表对象
function createLinkList(){
let first = null; //头指针
let end = null; //尾指针
let LinkList = {
//构造空链表
createEmpty : function(){
//头结点
first = {
data : null,
next : null
};
end = first;
},
//头插法建立单链表
createByHead : function(arr){
this.createEmpty();
for(let i=0,len=arr.length; i<len; i++){
first.next = {
data : arr[i],
next : first.next
};
}
},
//尾插法建立单链表
createByEnd : function(arr){
this.createEmpty();
for(let i=0,len=arr.length; i<len; i++){
end = end.next = {
data : arr[i],
next : null
};
}
},
//遍历
printList : function(callback){
for(let index = 1,p = first.next; p!=null; index++){
callback.call(this,index,p.data);
p = p.next;
}
},
//插入 在第i个节点位置插入节点
insert : function(i,value){
//查找第i-1个节点
let p = this.getNode(i-1);
try{
if(p==null) throw "该位置无法插入节点";
else{
p.next = {
data : value,
next : p.next
}
}
//如果p指向end,尾指针移动
if(p == end){
end = p.next;
}
}catch(err){
console.log(err);
}
},
//获取第i个节点的引用
getNode : function(i){
let p = first, count = 0;
while(p!=null && count<i){
p = p.next;
count++;
}
return p;
},
//计算表长
getLength : function(){
let p = first, length = 0;
while(p.next != null){
p = p.next;
length++;
}
return length;
},
//获取第i个节点的值
getValue : function(i){
let p = this.getNode(i);
try{
if(p==null) throw "没有该节点";
else return p.data;
}catch(err){
console.log(err);
}
},
//获取特定值所对应的序号
getIndex : function(value){
let p = first, count = 0;
while(p != null){
if(p.data == x) return count;
p = p.next;
count++;
}
return count;
},
//删除第i个节点 返回被删节点的值
delete : function(i){
let p = this.getNode(i-1); //获取第i-1个节点
try{
//第i-1或i个节点不存在
if(p==null || p.next==null) throw "节点不存在";
else{
let q = p.next,x = q.data;
p.next = q.next;
q = null;
return x;
}
}catch(err){
console.log(err);
}
},
//删除全表
deleteAll : function(){
while(first != null){
let q = first;
first = first.next;
}
end = null;
},
}
//自动执行一次创建空链表
LinkList.createEmpty();
return LinkList;
}
let LinkList = createLinkList();
LinkList.printList(function(index,value){
console.log("第"+index+"个节点的值是" + value);
});
</script>
</body>
</html>
用createLinkList()中的LInkList对象作为链表对象,则createLinkList()就是其作用域。能形成私有变量的效果,因为first,end都是外部不可见的。而createLinkList()只要执行一次就可以了,则createEmpty()只执行一次,模拟了无参构造。