JavaScript描述---链表


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();

测试结果如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值