// 创建一个链表
function LinkedList(){
// 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一个节点项目的指针
let Node = function(element){
this.element = element;
this.next = null;
};
// 长度初始化为0,列表头部初始化为空
let length = 0;
let head = null;
// append方法,向链表尾部追加元素
this.append = function(element){
let node = new Node(element),
current;
// 列表中的第一个节点
if(head == null){
head = node;
}
else{
current = head;
// 循环列表,直到找到最后一项
while(current.next){
current = current.next;
}
// 找到最后一项,将next值赋给node,建立链接
current.next = node;
}
// 更新列表长度
length++;
};
// insert方法,向列表的特定位置插入一个新的项
this.insert = function(position, element){
// 检查越界值
if(position >=0 && position <=length){
// current是对插入元素之后的元素的引用,previous是对插入元素之前的元素的引用
let 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;
}
node.next = current;
previous.next =node;
}
// 更新列表长度
length++;
return true;
}
else{
return false;
}
};
// removeAt方法:从链表特定位置移除一项
this.removeAt = function(position){
// 检查越界值
if(position > -1 && position < length){
let current = head,
previous,
index = 0;
// 移除第一项
if(position === 0){
head = current.next;
}
else{
while(index++ < position){
previous = current;
current = current.next;
}
// 将previous与current的下一项链接起来,跳过current从而移除它
previous.next = current.next;
}
// 更新列表长度
length--;
return current.element;
}
else{
return null;
}
};
// remove方法:从列表中移除一项
this.remove = function(element){
let index = this.indexOf(element);
// 调用removeAt()方法
return this.removeAt(index);
};
// indexOf方法:返回元素在列表中的索引,如果没有该元素则返回-1;
this.indexOf = function(element){
let current = head,
index = 0;
while(current){
if(element === current.element){
return index;
}
index++;
current = current.next;
}
return -1;
};
// isEmpty方法,如果链表中不包含任何元素,则返回true,否则返回false
this.isEmpty = function(){
return length === 0;
};
// size方法,返回链表中包含的元素个数,与数组的length属性类似
this.size = function(){
return length;
};
// getHead方法:返回链表第一个元素
this.getHead = function(){
return head;
};
// toSting方法,由于链表使用了Node类,重写了javascript的toString方法,让其只输出元素的值
this.toString = function(){
let current = head,
string = '';
while(current){
string += current.element + (current.next ? ',':'');
current = current.next;
}
return string;
};
// print方法,用于在控制台输出链表元素
this.print = function(){
console.log(this.toString());
};
}
// 链表的使用
var lnkst = new LinkedList();
// 打印链表长度
console.log(lnkst.size());
// 给链表添加元素
lnkst.append(1);
lnkst.append(2);
lnkst.append(3);
lnkst.append(4);
lnkst.append(5);
// 调用打印方法
lnkst.print(); //输出1,2,3,4,5
// 插入元素
lnkst.insert(2,'a');
lnkst.print(); //输出1,2,a,3,4,5
// 按位置删除元素
lnkst.removeAt(2);
lnkst.print(); //输出1,2,3,4,5
// 按值删除元素
lnkst.remove(5);
lnkst.print(); //输出1,2,3,4
//判断是否为空
console.log(lnkst.isEmpty()); //false
// 获取头部;
console.log(lnkst.getHead()); //1