1.单向链表
(1)数组的长度是固定的,因此当数组已被数据填满时,再要加入新的元素就会非常困难;
(2)数组删除和添加元素时,需要将数组中的其他元素向前或向后平移;
在JavaScript中,数组被实现成了对象,使用splice()方法可不需要访问数组中的其他元素,但是效率很低。
(1)链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;
(2)链表是使用指针进行构造的列表,其中每个结点都有指针成员变量指向列表中的下一个结点。
find():查找元素
display():显示链表节点的元素
findPrevious:找到链表节点的前一个节点
insert():插入节点
remove():删除节点
//Node类包含两个属性:element用来保存节点上的数据,next用来保存指向下一个节点链接。
function Node(element){
this.element=element;
this.next=null;
}
//LList提供了链表的属性和操作链表的方法
function LList(){
this.head=new Node("head");//生成头节点
this.find=find;
this.insert=insert;
this.display=display;
this.findPrevious=findPrevious;
this.remove=remove;
}
//删除链表节点
function remove(item){
var preNode=this.findPrevious(item);
if(!(preNode.next==null)){
preNode.next=preNode.next.next;
}
}
//找到链表节点的前一个节点
function findPrevious(item){
var currNode=this.head;
while(!(currNode.next==null)&&(currNode.next.element!=item)){
currNode=currNode.next;
}
return currNode;
}
//显示链表的所有节点的值
function display(){
var currNode=this.head;
while(!(currNode.next==null)){
console.log(currNode.next.element);
currNode=currNode.next;
}
}
//查找节点
function find(item){
var currNode=this.head;
while(currNode.element!=item){
currNode=currNode.next;
}
return currNode;
}
//在链表中插入节点
function insert(newElement,item){
var newNode=new Node(newElement);
var current=this.find(item);
newNode.next=current.next;
current.next=newNode;
}
测试用例如下:
var cities=new LList();
cities.insert("Conway","head");
cities.insert("Russelliville","Conway");
cities.insert("Carlisle","Russelliville");
cities.insert("Alma","Carlisle");
cities.display();
cities.remove("Carlisle");
测试结果如下图所示:
2.双向链表
(1)它的每个数据结点中都有=两个=指针,分别指向直接后继和直接前驱。
(2)从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
find():查找元素
display():显示链表节点的元素
findLast:找到链表节点的最后一个节点
insert():插入节点
remove():删除节点
//Node类包含三个属性:element用来保存节点上的数据,next用来指向直接后继节点,previous用来指向直接前驱节点。
function Node(element){
this.element=element;
this.next=null;
this.previous=null;
}
//LList提供了链表的属性和操作链表的方法
function LList(){
this.head=new Node("head");
this.find=find;
this.insert=insert;
this.display=display;
this.findLast=findLast;
this.remove=remove;
this.disReverse=disReverse;
}
//反序显示链表元素
function disReverse(){
var currNode=this.head;
currNode=this.findLast();
while(!(currNode.previous==null)){
console.log(currNode.element);
currNode=currNode.previous;
}
}
//找到链表的最后一个元素
function findLast(){
var currNode=this.head;
while(!(currNode.next==null)){
currNode=currNode.next;
}
return currNode;
}
//删除链表元素
function remove(item){
var currNode=this.find(item);
if(!(currNode.next==null)){
currNode.previous.next=currNode.next;
currNode.next.previous=currNode.previous;
currNode.next=null;
currNode.previous=null;
}
}
//显示链表元素
function display(){
var currNode=this.head;
while(!(currNode.next==null)){
console.log(currNode.next.element);
currNode=currNode.next;
}
}
//在链表中找到满足要求的元素
function find(item){
var currNode=this.head;
while(currNode.element!=item){
currNode=currNode.next;
}
return currNode;
}
//在链表中插入元素
function insert(newElement,item){
var newNode=new Node(newElement);
var current=this.find(item);
newNode.next=current.next;
newNode.previous=current;
current.next=newNode;
}
测试用例如下:
var cities=new LList();
cities.insert("Conway","head");
cities.insert("Russelliville","Conway");
cities.insert("Carlisle","Russelliville");
cities.insert("Alma","Carlisle");
cities.display();
cities.remove("Carlisle");
cities.display();
cities.disReverse();
测试结果如下图所示: