使用JavaScript实现单向链表

链表是一个存储有序元素的集合,元素在内存中不是连续放置的,每个元素由元素本身节点和指向下一个节点的指针组成。
在这里插入图片描述
链表的优点:添加或者移除元素不需要移动其他元素。
链表的缺点:访问链表的元素,需要从表头开始迭代访问。

使用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;
	};

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值