您的位置:首页 > 理论基础 > 数据结构算法

js数据结构——链表(一)

2017-01-22 00:00 183 查看
摘要: js数据结构——链表(一)

1.创建链表

//定义链表对象
function LinkedList(){
//定义节点类
var Node = function(element){
this.element = element;    //元素值
this.next = null;          //next元素,指向下一个节点
}
var length = 0;
var head = null;
}

2.向链表尾部追加元素

LinkedList.prototype.append = function(element){
//新建一个几点对象,然后创建一个游标
var 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++;       //更新链表的长度
};


(1)先将传入的参数变为节点类型的实例,使其具有next属性。

(2)然后定义一个游标current,游标的作用即使保证原链表不变,而游标通过移动,获取要操作的位置,并可以获取链表中的一段。方便链表的拼接操作。

(3)如果链表为空,直接head = node。

(4)如果不为空,通过游标current找到最后一项,然后current.next = node;

3.在任意位置插入一个元素

LinkedList.prototype.insert = function(position,element){
//检查边界值,在链表长度范围内才能执行
if(position >= 0 && position <= length){
var node = new Node(element),
current = head,
previous,
index = 0;
if(position === 0){         //如果添加的位置是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;
}
};


(1)两个参数,position和element

(2)posiiton在0~length-1之间才能执行

(3)如果position是0,node.next = current;然后把head节点赋值为node即可

(4)否则,通过current找到要插入的位置,该位置的前一位是previous,然后node.next = current;previous.next = node;即可

4.从链表中移除元素

LinkedList.prototype.removeAt = function(position){
//检查是否越界
if(position >= 0 && position < length){
var 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;
}
};


(1)参数:position

(2)如果要移除的是第一项,直接head = current.next;

(3)否则循环找到要移除的位置,而要移除的前一位是previous,然后将previous.next = current.next;即可,就移除了current。

4.indexOf()方法

//获取元素索引值
LinkedList.prototype.indexOf = function(element){
var current = head,
index = 0;
while(current){
if(element === current.element){
return index;
}
index++;
current = current.next;
}
return -1;
};


(1)参数:element

(2)循环条件:当前current存在

(3)如果element等于当前current值,返回index

(4)如果不等,current = current.next;索引值index++;

(5)如果前面都没返回值,那最后的return语句得到执行,返回-1,表示未找到

5.toString()方法

LinkedList.prototype.toString = function(){
var current = head,
string = '';
while(current){
string += current.element+" ";
current = current.next;
}
return string;
};
//判空
LinkedList.prototype.isEmpty = function(){
return length === 0;
};


(1)循环条件:current存在

(2)拼接字符串

(3)current=current.next

总结

1.head节点十分重要,任何操作的发起都是从head开始,有时候我们看似已经完成了插入或删除操作,但忘记重新赋head节点的值,会导致下一次操作无法正常进行

2.current和previous都是游标类型的节点,在不影响原链表的情况下,用于找到要操作的位置,并可以获取链表中的一段。一般给current赋初值位head。

3.在插入,移除的时候,要判断位置是否为0;在追加的时候,要判断链表是否位空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: