(数据结构篇)基于JavaScript实现的单链表


前言

       有句话为算法为程序员的内核。最近前端vue3的项目刚实现完,最近的具体打算就是复习一下JS高级语法和数据结构,我大一的时候曾学习过数据结构当时用的C语言,那时候C语言基础还不扎实就去硬学。导致我对数据结构一直有敬畏之心。实际上当我对JavaScript这门有更深入了解后,简单数据结构实现起来并不难。JavaScript是一门单线程非阻塞语言,在浏览器端有重大作为。JavaScript对前端工程师的重要性不言而喻。
       最近很焦虑,自己的前端圈子在不断拓宽,认识了一些优秀的人。比如合工大机械大三转码成功进入字节实习等。这些大佬真的就是吾辈楷模吧。谁不是在焦虑之下才能成长的呢?不多说了,本篇博客是围绕链表展开的。有详细的代码注释了已经。


提示:以下是本篇文章正文内容,下面案例可供参考

一、链表是什么?

1、基础概念
       链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制是完全不同的。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。(即在数据逻辑上是线性的),它的每个结点由两个域组成:①存储数据元素的数据域。②存储下一个结点地址的指针域。
2、与数组进行对比
 优点:
 1.内存空间不是必须连续的.可以充分利用计算机的内存.实现灵活的内存动态管理.
 2.链表不必在创建时就确定大小,并且大小可以无限的延伸下去.
 3.链表在插入和删除数据时,时间复杂度可以达到O(1).相对数组效率高很多.
 缺点
 1.链表访问任何一个位置的元素时,都需要从头开始访问.(无法跳过第一个元素访问任何一个元素).
 2.无法通过下标直接访问元素,需要从头一个个访问,直到找到对应的元素.

二、单链表的代码实现(JavaScript版)

代码如下(示例):

    <script>
        //封装链表类
        function LinkedList() {

            //内部的类:节点类
            function Node(data) {
                this.data = data
                this.next = null
            }

            //属性
            this.head = null
            this.length = 0

            //1.在链表尾添加节点
            LinkedList.prototype.append = function (data) {
                //1.创建新节点
                var newNode = new Node(data)

                //2.判断是否添加的是第一个节点
                if (this.head == null) {   //2.1是第一个节点
                    this.head = newNode
                } else {                    //2.2不是第一个节点
                    var current = this.head
                    while (current.next) {
                        current = current.next
                    }
                    current.next = newNode
                    // console.log(1)
                }

                //3.length+1
                this.length += 1
            }

            //2.toString方法
            LinkedList.prototype.toString = function () {
                //1.定义变量
                var current = this.head
                var result = ''

                //2.循环获取一个个节点
                while (current) {
                    result += current.data + ' '
                    current = current.next
                }

                return result
            }

            //3.insert方法
            LinkedList.prototype.insert = function (position, data) {
                //1.对position进行判断
                if (position < 0 || position > this.length) return false
                //2.根据data创建newNode
                var newNode = new Node(data)

                //3.判断插入的位置是否是第一个
                if (position == 0) {
                    newNode.next = this.head
                    this.head = newNode
                } else {
                    var current = this.head
                    var previous = null
                    var index = 0
                    while (index < position) {
                        previous = current
                        current = current.next
                        index++
                    }
                    newNode.next = current
                    previous.next = newNode
                }

                //4.length+1
                this.length += 1

                return true
            }

            //4.get方法
            LinkedList.prototype.get = function (position) {
                //1.对position进行判断
                if (position < 0 || position > this.length) return false
                //2.获取对应的data
                var current = this.head
                var index = 0
                while (index < position) {
                    current = current.next
                    index++
                }

                return current.data
            }

            //5.indexof方法
            LinkedList.prototype.indexof = function (data) {
                var current = this.head
                var index = 0
                while (current) {
                    if (data == current.data) {
                        return index
                    }
                    index += 1
                    current = current.next
                }
                //如果没找到
                return -1
            }

            //6.updata方法根据某个位置修改该位置的元素
            LinkedList.prototype.update = function (position, newData) {
                //1.对position进行判断
                if (position < 0 || position >= this.length) return false

                //2.查找正确节点
                var current = this.head
                var index = 0

                while (index < position) {
                    current = current.next
                    index += 1
                }

                current.data = newData

                return true
            }

            //7.removeAt方法
            LinkedList.prototype.removeAt = function (position) {
                //1.对position进行判断
                if (position < 0 || position >= this.length) return null
                //2.判断删除的是不是第一个节点
                var current = this.head
                if (position == 0) {
                    this.head = this.head.next
                } else {
                    var index = 0
                    var previous = null
                    while (index < position) {
                        previous = current
                        current = current.next
                        index++
                    }
                    //前一个节点next指向后一个节点
                    previous.next = current.next
                }

                this.length -= 1

                return current.data
            }

            //8.remove方法(删除指定data的节点)
            LinkedList.prototype.remove = function (data) {
                //1.获取data在列表中的位置
                var position = this.indexof(data)
                //2.根据位置信系删除节点
                return this.removeAt(position)
            }

            //9.isEmpty方法()
            LinkedList.prototype.isEmpty = function () {
                return !this.length ? true : false
            }

            //10.size方法()
            LinkedList.prototype.size = function () {
                return this.length
            }
        }
		
		//以下为一些测试代码。
        var linklist = new LinkedList()
        linklist.append('hdf')
        linklist.append('hdf1')
        linklist.append('hdf2')
        linklist.append('hdf3')
        linklist.insert(4, '123')
        linklist.update(4, '1468451684654')
        linklist.remove('hdf')
        // linklist.removeAt(2)
        // alert(linklist.get(4))
        // alert(linklist.indexof('123'))
        alert(linklist.toString())
        alert(linklist.isEmpty())
        alert(linklist.size())

    </script>

总结

       希望能继续加油吧。为什么我每次只有emo的时候才会写博客呢?或者说我把博客当作自己的朋友圈一样。最近看了一个牛客大佬的个人博客,看见他的生活博客篇,去北漂的他,不知道为什么我能感觉到他可能是我未来的样子。大概率在未来要一个人背井离乡,肩负家庭重担,虽然我没有他那么强那么优秀。欢迎各位进行交流,最后感谢大家访问我的博客,我是一名半路出家的前端程序员。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值