宝哥软件园

JavaScript数据结构的单链表和循环链表

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

数据结构系列前言:

数据结构作为程序员的基础知识,需要我们每个人牢牢掌握。最近我也开始了数据结构的第二次研究,弥补当年挖的坑。当时上课的时候跟着讲课,没有亲自实现任何数据结构,更不用说用数据结构解决问题了。现在让我们填坑。在这里挣扎着提醒看我博客的孩子,如果你还是学生,千万不要低估任何基础课的学习。这个时候挖的坑需要加倍努力去填,不然会直接影响到自己的能力等等。永远不要给自己挖坑

言归正传,关于链表的数据结构知识,这里简单介绍一下:

链表是物理存储单元上的非线性、不连续的数据结构(在数据逻辑上是线性的),它的每个节点由两个字段组成:数据字段和指针字段。数据字段存储实际数据,而指针字段存储指针信息,指向链表中的下一个元素或前一个元素。由于指针的存在,链表的存储在物理单元上是不连续的。

链表的优缺点同样明显。与线性表相比,链表在添加和删除节点时效率更高,因为它们只需要修改指针信息来完成操作,而不是像线性表(数组)那样移动元素。同样的,链表的长度理论上是无限的(在内存容量范围内),长度可以动态变化,比线性列表有很大的优势。相应地,由于线性表不能随机访问节点,只能通过指针沿链表遍历查询来访问,因此其访问数据元素的效率相对较低。

以下是JS部分

它封装了以下常见方法和描述:

方法描述append(element)添加节点元素insert(position,element)将节点插入位置,element removeAt(position)根据索引值删除节点,remove(element)搜索并删除给定节点,element remove()删除链表中的最后一个节点,indexOf(element)查找并返回给定节点元素的索引值isEmpty(),判断链表是否为空。size()获取链表的长度。toString()将其转换为字符串输出。获取头节点。getTail()获取尾节点。每个常用方法的算法描述这里就不写了。相信大家都很容易看懂。毕竟是很基础的知识。

单一链接列表:

函数LinkedList(){ /*节点定义*/var节点=函数(元素){ this.element=元素;//存放节点内容this.next=null/指针} var length=0,//存放链表长度head=null//头指针this.append=函数(元素){ var node=new Node(元素),当前;//操作所用指针if(!head){ head=节点;} else { current=headwhile(当前。下一个){ current=current。接下来;} current.next=节点;}长度;返回真;};this.insert=函数(位置,元素){ if(位置=0位置=长度){ var node=new Node(元素),当前=头,上一个,索引=0;如果(位置===0){ node。next=当前;head=节点;}else{ while(索引位置){ previous=current current=current . next }节点. next=currentprevious.next=节点;}长度;返回真;} else {返回false } }这个。removeat=函数(位置){ if(position-1位置长度){ var current=head,previous,index=0;if(位置===0){ head=current。接下来;}else{ while(索引位置){上一个=currentcurrent=current.next}上一个。下一个=当前。接下来;};长度-;返回current . element } else { return null } };这个。remove=function(element){ var current=head,previousif(element===current。元素){ head=current。接下来;长度-;返回真;}上一个=当前;current=current . next while(current){ if(element===current。元素){ previous。下一个=当前。接下来;长度-;返回真;}else{ previous=当前;当前=当前.下一个} }返回false };这个。remove=function(){ if(length 1){ return false;} var current=head,previous if(length==1){ head=null;长度-;返回current . element } while(current . next!==null){ previous=current;current=current . next } previous . next=null长度-;返回current . element };这个。indexof=函数(元素){ var current=head,index=0;while(current){ if(element===current。元素){返回索引;}索引;current=current.next}返回false };this . isempty=function(){ 0返回长度===0;};this . size=function(){ 0返回长度;};这个。tostring=function(){ var current=head,string=while(current){ string=current。元素;current=current.next}返回字符串;};这个。GetHead=function(){ return head;} } 循环链表:在单链表的基础上,将尾节点的指针指向头结点,就构成了一个循环链表。环形链表从任意一个节点开始,都可以遍历整个链表。

function circulalink dlist(){ var Node=function(element){ this。元素=元素;this.next=null} var length=0,head=nullthis.append=函数(元素){ var node=new Node(元素),当前;if(!head) { head=节点;node . next=head } else { current=head hile(current . next!==head){ current=当前。接下来;} current.next=节点;node . next=head };长度;返回真;};this.insert=函数(位置,元素){ if(位置-1位置长度){ var node=new Node(元素),index=0,current=head,previousif(position===0){ node。next=headhead=节点;}else{ while(索引位置){上一个=当前当前=当前.下一个}上一个.下一个=节点;node.next=当前;};长度;返回真;} else {返回false } }这个。removeat=函数(位置){ if(position-1位置长度){ var current=head,previous,index=0;if(位置===0){ head=current。接下来;}else{ while(索引位置){上一个=currentcurrent=current.next}上一个。下一个=当前。接下来;};长度-;返回current . element } else { return null } };这个。remove=function(element){ var current=head,previous,index check=0;而(当前索引检查长度){ if(当前。element===element){ if(indexCheck==0){ head=current。接下来;长度-;返回真;} else { previous。下一个=当前。接下来;长度-;返回真;} }else{ previous=当前;current=current . nextindexcheck } }返回false };这个。remove=function(){ if(length===0){ return false;} var current=head,previous,index check=0;如果(长度===1){ head=null;长度-;返回current . element } while(index CheCk length){ previous=current;current=current . next } previous . next=head长度-;返回current . element };这个。indexof=函数(元素){ var current=head,index=0;而(当前索引长度){ if(当前。element===element){ return index;} else { index current=current . next } }返回false };this . isempty=function(){ 0返回长度===0;};this . size=function(){ 0返回长度;};这个。toString=function(){ var current=head,String=' ',index check=0;而(当前索引检查长度){ string=current . element current=current . nextindexcheck }返回字符串;};} 使用方法:

在类外部扩充方法:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+