JavaScript单向链表的创建遍历插入删除操作

Posted 别Null.了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript单向链表的创建遍历插入删除操作相关的知识,希望对你有一定的参考价值。

目录

链表

什么是链表

链表的分类

链表与数组的区别

单向链表的创建、遍历、插入、删除代码

总结


链表

什么是链表

链表:数据的一种存储结构,一个链表包含若干个节点,每个节点至少包含一个数据域和一个指针域,指针域指向下一个节点。

强调:链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身和指向下一个元素的指针组成。

链表的分类

 (1)单向链表:每个节点都只有一个指向其下一个节点的指针域(next)。
 (2)双向链表:每个节点都有一个指向其前一个节点的指针域(prev)和指向其下一个节点的指针域(next) 。

链表与数组的区别

  • 相对于传统的数组,链表的一个好处在于,添加或移除元素的时候不需要移动其他元素。然而,链表需要使用指针
  • 数组是可以直接访问任何位置的任何元素,而要想访问链表中间的一个元素,需要从起点(表头)开始迭代到列表直到找到所需元素。

单向链表的创建、遍历、插入、删除代码

js代码:

//定义单向链表的节点类
class Node{
    constructor(data){
        this.data = data    //节点的数据域(数据成员)
        this.next = null    //节点的指针域(指针成员)   
    }
}
//定义单向链表类
class SingleLinked{  
    constructor(){
        this.size = 0  //单链表的长度,用来记录链表中的节点个数,为一个空链表
        this.head = new Node('head')  //是链表的头指针:记录链表的起始地址
        this.currentNode = ''  //用来记录当前节点
    }
    //获取链表的长度
    getLength(){
        return this.size
    }
    //判断链表是否为空
    isEmpty(){
        return this.size === 0   //如果this.size为0则说明链表为空,即返回true
    }
    //遍历链表:不重复的访问链表中的每一个节点
    displayList(){
        var list = ''
        var currentNode = this.head  //指向链表的头指针
        while(currentNode){  //若当前节点不为空,则执行循环
            list+=currentNode.data    //连接节点的数据域
            currentNode = currentNode.next  //让当前指针指向当前节点的下一个节点
            if(currentNode){   //如果currentNode不为空则加上连接符
                list += '->'  //链表节点的连接符
            }
        }
        console.log(list)
    }

    //获取链表的最后一个节点
    findLast(){
        var currNode = this.head
        while(currNode.next){   //若当前节点的next域为空,则他是链表的最后一个节点,跳出循环
            currNode = currNode.next  //若当前节点的next域不为空则让指针指向当前节点的下一个节点
        }
        return currNode
    }

    //采用尾插法给链表插入元素
    appendNode(element){
        var currNode = this.findLast()  //找到链表的最后一个节点
        var newNode = new Node(element)  //创建一个新的节点
        currNode.next = newNode
        newNode.next = null
        this.size++   //链表的长度加1
    }

    //删除链表中的一个节点
    delete(element){
        //this.displayList()
        var currentNode = this.head
        try{
            while((currentNode.next!=null)&&(currentNode.next.element!=element)){  //判断,如果节点靠后则节点的next的next为空,不为空时进行删除
            if(currentNode.next.data === element){
                currentNode.next = currentNode.next.next    
                this.size--
            }else{
                currentNode = currentNode.next
                }
            }
        }
        catch(e){   //测试函数,判断函数的运行错误
            console.log(e)
        }
    }
}

测试代码: 

<script src="../js/单向链表.js"></script>
    <script>  //不能写在有js代码的javascript中
        var slist = new SingleLinked()
        console.log(slist.isEmpty())  //打印链表是否为空,若为空则输出true
        slist.appendNode(1001)   

        //创建链表
        var arr = [1001,1234,1006,7788,5512,6129]
        for(var i=0;i<arr.length;i++){
            slist.appendNode(arr[i])
        }
        
        //遍历输出链表
        slist.displayList()

        //删除链表中的1006元素
        slist.delete(1006)
        slist.displayList()
    </script>

实现结果:

总结

单向链表是js中一个较为重要的知识点,需要熟练掌握其思想与各种有关操作,同时应该了解链表与数组的区别和联系。

以上是关于JavaScript单向链表的创建遍历插入删除操作的主要内容,如果未能解决你的问题,请参考以下文章

java对单向单向链表的操作

线性表之单向链表的基本操作实现

单向链表的创建及其简单功能的实现

头插法链表的基本操作:创建空链表,插入结点,遍历链表,求链表长度,查找结点,删除结点

C语言提升

数据结构之链表