JS实现单向链表

前序

回过头看看以前用JS写了一半的链表,终于还是没忍住,实现了前段时间看着头疼的链表,其实链表也就那样。以前没细看数据结构,面试时被顺丰面试官要求手撕链表,怂的直说会用伪代码实现,就没然后了!面完后我就刻苦钻研,还是没搞懂大佬用JS实现的链表,虽然写了一半,但思路还是云里雾里的,昨天看了链表的相关数据结构细节问题,今天无意间看到以前留下的垃圾代码,就根据    把链表的基础属性与功能映射成JS代码,这个过程才真正理解到底层基础跟原理相当重要,在加上逻辑思维的体现,实现一个链表还是对以后学习有启发的。

有些人一开始就能得到正解,然而像我经历了很多才得到正解!

以上纯属瞎扯皮,我这个人爱思考、喜欢分享个人精神世界,有事没事咱一块吹吹水哈!

正文

链表分为单向链表、双向链表、循环链表 。

单向链表 :单向链表包含两个域,一个是信息域,一个是指针域。也就是单项链表的节点被分成两部分,第一部分保存或显示节点信息,第二部分存储下一个节点的地址,而最后一个节点则指向一个空值null。

双向链表 :双向链表每个节点两个指针,一个指向前一个节点的指针,另一个指向后一个节点的指针,而头节点和尾节点都指向空值null。

循环链表: 循环链表就是首节点和尾节点被连接在一起。

JS手撕单向链表:

// 定义节点
 class Node{
	constructor(v,next){
		this.val=v;
		this.next=next;
	}
 }
 // 定义链表
 class LinkList{
 	constructor(){
 		//链表长度
 		this.size=0;
 		//虚拟头部 
 		this.dummyNode=new Node(null,null);
 	}
 	//查找节点
 	find(header,currentIndex,index){
 		if(index===currentIndex){
 			return header;
 		}
 		return this.find(header.next,currentIndex+1,index);
 	}
 	//查找某一节点的后继节点
 	getNode(index){
		this.checkIndex(index);
		if(this.isEmpty()){
			return null
		}
		return this.find(this.dummyNode,0,index).next;
 	}
 	//插入节点 
 	insertNode(v,index){
		this.checkIndex(index);
		let prev=this.find(this.dummyNode,0,index);
		prev.next=new Node(v,prev.next);
		this.size+1;
		return prev.next;	
 	}
 	//插入头节点 
 	insertFirstNode(v){
 		return addNode(v,0);
 	}
 	//插入尾节点
 	insertLastNode(v){
 		return addNode(v,this.size);
 	}
 	//在链表中非首尾的任意位置插入节点
 	insertAnyNode(v,index){
		return addNode(v,index);
 	}
 	//删除节点
 	removeNode(index, isLast){
 		this.checkIndex(index);
 		index=isLast ? index-1 : index;
 		let prev=this.find(this.dummyNode,0,index);
 		let node=prev.next;
 		prev.next=node.next;
 		node.next=null;
 		this.size--;
 		return node
 	}
 	//删除头节点
 	removeFirstNode(){
 		return this.removeNode(0)
 	}
 	//删除尾节点
 	removeLastNode(){
 		return this.removeNode(this.size,true)
 	}
 	//删除非首尾的任意位置节点
 	removeAnyNode(index){
 		return this.removeNode(index,false)
 	}
 	checkIndex(index){
		if(index<0 || index>this.size){
			throw Error('Index Error');
		}
 	}
 	//链表长度 
 	getSize(){
 		return this.size;
 	}
 	//链表判空 
 	isEmpty(){
 		return this.size===0;
 	}
 }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值