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中一个较为重要的知识点,需要熟练掌握其思想与各种有关操作,同时应该了解链表与数组的区别和联系。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别Null.了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值