链表是一个存储有序元素的集合,元素在内存中不是连续放置的,每个元素由元素本身节点和指向下一个节点的指针组成。
链表的优点:添加或者移除元素不需要移动其他元素。
链表的缺点:访问链表的元素,需要从表头开始迭代访问。
使用JavaScript实现一个单向链表类:
function Linkedlist(){
//辅助类Node
var Node = function(element){
//元素节点本身
this.element = element;
//指向下一个节点的指针
this.next = null;
}
//表头
var head = null;
//链表的长度
var length = 0;
//向链表添加元素
this.append = function(element){
var node = new Node(),//创建一个节点
current;//最后一个元素
if(head === null)
{ //如果链表为空,那么添加的就是链表的表头
head = node;
}
else
{
//从表头开始遍历,找到最后一项,再在表尾添加新加项
current = head;
while(current.next)
{
current = current.next;
}
//将最后一项的指针指向新的元素
current.next = node;
}
//更新链表的长度
this.length++;
}
//移除特定位置的链表元素,position代表位置,从0到size-1
this.removeAt = function(position){
//先检查传入的position是否在0到size内,如果不在,返回flase
if(position >= 0 && position < this.length)
{
var current = head, //初始,从表头开始查找
previous, //移除元素的上一个
index = 0; // 移除元素的下一个
//移除第一项,直接把表头设置到第二项
if (position === 0)
{
head = current.next;
}
else
{
//从表头开始遍历查找要移除的元素的上一项和下一项
while (index < position)
{
previous = current;
current = current.next;
index++;
}
//将previous与current的下一项链接起来:跳过current,从而移除它
previous.next = current.next; // {9}
}
//更新链表的长度
length--;
//返回被移除的元素
return current.element;
}
else
{
return false;
}
}
//在任意一个位置插入一个元素
this.insert = function(position, element){
//检查position是否在0和size-1之间,如果不在,返回false
if (position >= 0 && position <= length){
var 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;
}
};
//toString方法
this.toString = function(){
var current = head, //从表头开始
string = ''; //定义一个string,用于拼接链表元素
while (current) { //从表头开始遍历链表,拼接链表元素
string = current.element;
current = current.next;
}
return string;
};
//indexOf方法,接收一个元素的值,如果存在,就返回该元素的所在位置,否则返回-1
this.indexOf = function(element){
var current = head, //设置起点为表头
index = 0;//index初始值为0
while (current) { //从表头开始遍历,找到和接收值一样的元素,返回
if (element === current.element) {
return index; //返回该元素的位置,结束遍历
}
index++;
current = current.next;
}
//如果不存在,返回-1
return -1;
};
/*通过indexOf方法和remover方法,可以实现移除一个特定值的元素
*/
移除一个特定值的元素
this.remove = function(element){
//先获取该元素的位置
var index = this.indexOf(element);
//通过位置移除该元素
return this.removeAt(index);
};
//isEmpty方法,判断链表是否为空
this.isEmpty = function() {
return length === 0;
};
//size方法,返回链表的长度
this.size = function() {
return length;
};
//getHead方法,查找表头元素
this.getHead = function(){
return head;
};
}