如果我们用js模拟链表的运行,应该怎么理解呢?网上大部分是贴一个概念,一张图,一段代码,但是对于小白来说还是很抽象的。什么指针?接下来是什么?为什么一会儿next=value,一会儿next=next?这让很多刚接触代码的人感到困惑,而JavaScript是一种没有“指针”概念的弱类型语言,导致很多文章中提到的指针都没有被忽略。链表是物理存储单元上的一种无序无顺序的存储结构,数据元素的逻辑顺序是通过链表中指针的链接顺序来实现的。链表由一系列节点组成(链表中的每个元素称为一个节点),节点可以在运行时动态生成。每个节点由两部分组成:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针域。当我们用JavaScript来表示指针时,我们可以把它想象成一个小推车。“小明有一辆车(车里有小梅)”->“小梅有一辆车(车里有一只小老虎)”->“小胡有一辆车(车里有小李)”单向我们假设工厂有一条工作流水线,一开始流水线上没有人:classLiushuixian{constructor(){this.head=null}}以“人”为节点,一个人携带一些信息和一无所有的购物车classPeople{constructor(people){this.people=peoplethis.next=null}}如果我们招募第一个人:/添加人员appendRen(people){//输入letnewPeople=newPeople(people)this.head=newPeople}//打印结果print(){letstr=''letcurrent=this.headwhile(current){str+=current.peoplecurrent=current.next}console.log(str)}}letl=newLiushuixian();l.appendPeople("Xiaoming-Che-->");//Xiaoming-Che-->ifRecruitalotofpeople:classLiushuixian{constructor(){this.head=null}//添加人员appendPeople(people){//entryletnewPeople=newPeople(people)//if(this.head===null){this.head=newPeople}else{//否则遍历,让他在线尾工作letcurrent=this.head//如果当前人的车里有人,我们就去下一个人while(current.next){current=current.next}//直到这个人的车里没有人,我们就去当前person添加新人到购物车current.next=newPeople}}//打印结果print(){letstr=''letcurrent=this.headwhile(current){str+=current.peoplecurrent=current.next}安慰。log(str)}}在管道中添加几个人,然后打印结果:letl=newLiushuixian();l.appendPeople("小明车-->");l.appendPeople("小梅车-->");l.appendPeople("小虎-car-->");l.appendPeople("小丽-car-->");l.print();//Xiaoming-car-->Xiaomei-car-->Xiaohu-Che-->Xiaoli-Che-->Wefireaperson.如果小虎被解雇,那么小丽接替小虎的工作,小梅直接和小丽连接:deletePeople(item){//如果item等于0,则头节点为下一个节点if(item===0){this.head=this.head.next;//假设前一个节点是头节点}else{//从第一个人开始寻找letindex=0;让prev=this.head;while(prev){index++;if(index===item){prev.next=prev.next.next//前一个节点直接指向第二个位置}else{prev=prev.下一个;}}}}//。.//解雇小美l.deletePeople(1);//Xiaoming-Che-->Xiaohu-Che-->Xiaoli-Che-->//thendismissXiaolil.deletePeople(2);//小明车-->Xiaohu-che-->//解雇小明l.deletePeople(0);//小虎车-->//关闭小虎l.deletePeople(0);当项目大于链的总长度时,操作应该停止://while(prev){index++;if(item>index){console.error('error:Exceededthelengthofthelinkedlist')return}//...dismissaperson最后,我们要雇用另一个人来插入工作链接。假设我们招募小芬,将其插入小明的后面和小梅的前面:insertPeople(people,item){letnewPeople=newPeople(people);lethead=this.head//如果在head处插入,新的head节点等于新的Employees,新员工的手推车包含oldman节点if(item===0){this.head=newPeoplenewPeople.next=head}else{letprev=headletindex=0while(prev){index++if(index===item){newPeople.next=prev.nextprev.next=newPeople}else{prev=prev.next}}}}//...l.insertPeople('Xiaofen-car-->',1)//小明-car-->Xiaofen-car-->Xiaomei-car-->Xiaohu-car-->xiaoli-car-->上面最后的next属性只是我们说的cart即指针字段,People构造函数代表一个节点,里面的people就是携带的数据信息。current.next=newPeople可以表示新节点newPeople被分配给next。此时next是一个携带数据信息的属性(指newPeople的地址),next指针域中有指向newPeople地址的指针。在js层面说清楚,就是承载newPeople值的属性。
