一、JavaScript数组与其他编程语言数组对比
- 其他语言
- 长度固定,当数组已经被数据填满之后,再无法加入其他元素,产生越界错误
- 添加和删除元素麻烦,需要将数组中的其他元素向前或向后移动
- JavaScript
- 长度不固定
- splice随意添加删除元素,无需移动其他元素
二、JavaScript数组缺点
- 被实现成了对象,因此在实际上使用时会很慢。于是我们可以考虑用链表来代替。
- 如果需要随机访问,数组仍然是最好的选择
三、链表概述
- 链表由一组节点组成,每个节点都有一个指针(对象的引用)指向它的后继。这个指针叫做链。
- 数组元素靠他们的位置进行引用,链表元素是通过相互之间的关系进行引用
- 遍历链表,就是跟着这条链,从头走到尾
- 头结点常常用来作为链表的入口,尾结点要指向NULL
四、基于对象的链表设计
1、Node类:表示结点
function Node(ele){
this.element = ele;
this.next = null;
}
2、LinkedList类:对链表的操作
function LinkedList(){
this.head = new Node("head");
this.find = find; //遍历链表,查找给定的元素
this.insert = insert; //插入节点
this.remove = remove; //删除节点
this.display = display; //遍历展示
this.findPre = findPre; //查找指定元素的前驱
}
3、查找节点
- 遍历链表,查找给定的数据。如果找到数据,就返回保存该数据的节点。(实现插入删除的基础)
function find(item){
var obj = this.head;
while(obj.element != item && obj != null){
obj = obj.next;
}
return obj;
}
代码解释
- 创建一个新节点,指向当前链表的头结点
- 遍历链表
- 找到返回结点,没找到则为null;
4、插入节点
- 向链表中插入一个节点,需要修改他的前面的节点使其指向新节点,新插入的节点则指向原来前前驱所指向的节点
- 图解:在p元素之后插入
function insert(cur,item){
function insert(cur,item){
var item = new Node(item);
var cur = this.find(cur);
if(cur){
item.next = cur.next;
cur.next = item;
}
}
}
3、删除节点
- 将待删出节点的前驱指向待删除节点的后继
- 将待删除节点指向NULL
- 删除要先找到待删除元素的直接前驱:
function remove(item){
var item = this.findPre(item);
if(item.next.next != null){
item.next = item.next.next;
}
}
4、显示链表中的所有元素
function display(){
var obj = this.head.next;
while(obj != null ){
console.log(obj.element);
obj=obj.next;
}
}
5、测试程序
var list = new LinkedList();
list.insert("head","monkey");
list.insert("monkey","cat");
list.insert("cat","mall");
list.display();
list.remove("cat");
list.display()