最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript实现一个链表结构源码分享

    正文概述 掘金(请不要耽误我修仙)   2021-04-02   387

    写在前面

    链表结构介绍

    • 单向链表
    • 双向链表
    • 单向循环链表
    • 双向循环链表
    • 环形链表

    源码实现

    /**
     * @author clearlove
     * @class Node   当前节点
     * @class LinkedList 当前链表
     * @function appendNode  添加节点
     * @function getNode  根据索引查找节点元素
     * @function appendAt  根据位置插入节点
     * @function remove    移除节点
     * @function searchCurrIndexof 根据元素查找索引
     * @function sort  链表排序
     * @function linkedToArr 链表转为数组
     * @function arrToLinked 数组转为链表
     * 
     */
    //声明一个Node节点
    class Node {
        constructor(data) {
            this.data = data
            this.next = null
        }
    }
    class LinkedList {
        constructor() {
                this.size = 0
                this.head = null
            }
            //增加一个节点
        appendNode(tempNode) {
                let node = new Node(tempNode)
                    //判断一下当前的链表是不是一个空的 this.head === null 或者是当前的链表的长度为0
                if (this.head === null) {
                    //如果是空的,那么我们的当前的节点就是第一位
                    this.head = node
                } else {
                    //如果不是空的,我们要做的是,将当前的节点追加到当前链表的最后一位的后面,
                    //也就是我们首先需要找到当前链表的最后一位,让后将他的next给当前的node
                    let current = this.getNode(this.size - 1) //找到当前的最后一位
                    current.next = node
                }
                //链表的长度追加
                this.size++
            }
            //找到当前一个 的节点
        getNode(index) {
                if (index < 0 || index >= this.size) {
                    throw new Error('error')
                }
                let current = this.head
                for (let i = 0; i < index; i++) {
                    current = current.next
                }
                return current
            }
            //按照指定位置增加
        appendAt(position, tempNode) {
                //首先要知道当前的位置是不是小于0  或者是大于当前链表的长度
                if (position < 0 || position > this.size) {
                    throw new Error('error')
                }
                let node = new Node(tempNode)
                if (position === 0) {
                    //从第一位开始追加,说明我们需要将当前的node的下一位等于之前的第一位,再将head等于当前的node
                    node.next = this.head
                    this.head = node
                } else {
                    //如果当前位置插入一个节点,需要做的就是将插入位置的之前节点的位置找到即可
                    let pre = this.getNode(position - 1)
                    node.next = pre.next
                    pre.next = node
                }
                this.size++
            }
            //删除指定节点的元素
        remove(position) {
            //首先要知道当前的位置是不是小于0  或者是大于当前链表的长度
            if (position < 0 || position > this.size) {
                throw new Error('error')
            }
            //先将当前头部节点找到
            let currentHead = this.head
            if (position === 0) {
                //说明当前我要删除的是第一位的节点,那么更新头部的信息为之前的节点的next
                this.head = currentHead.next
            } else {
                //如果链表中的某一个节点的删除的时候,我们需要做的就是找到删除的节点的前一个节点,然后将前一个节点的next等于被删除的节点的next
                let pre = this.getNode(position - 1)
                currentHead = pre.next
                pre.next = currentHead.next
            }
            this.size--
        }
    
        //按照指定元素的索引
        searchCurrIndexof(tempNode) {
                //从头部开始找
                let current = this.head
                for (let i = 1; i < this.size; i++) {
                    if (current.data === tempNode) {
                        return i
                    }
                    current = current.next
                }
                //完全找不到的时候我们直接返回-1或者false都可以
                return -1
            }
            //排序
        sort(tempLinked) {
                let tempArr = this.linkedToArr(tempLinked)
                let maxL = tempArr.length - 1
                for (let j = 0; j < maxL; ++j) {
                    let flag = true
                    for (let i = 0; i < maxL - j; ++i) {
                        if (tempArr[i] > tempArr[i + 1]) {
                            let temp = tempArr[i]
                            tempArr[i] = tempArr[i + 1]
                            tempArr[i + 1] = temp
                            flag = false
                        }
                    }
                    if (flag) {
                        break
                    }
                }
                return this.arrToLinked(tempArr)
            }
            //链表转为数组
        linkedToArr(tempLinked) {
                let result = []
                let headNode = tempLinked.head
                while (headNode) {
                    result.push(headNode.data)
                    headNode = headNode.next
                }
                return result
            }
            //数组转为链表
        arrToLinked(tempArr) {
            let ll = new LinkedList()
            tempArr.map(res => {
                ll.appendNode(res)
            })
            return ll
        }
    }
    

    测试结果

    //测试
    let ll = new LinkedList()
    ll.appendNode(1)
    ll.appendNode(2)
    ll.appendNode(3)
    ll.appendAt(3, 'jim')
    ll.appendNode(4)
    //这里是为了将结果全部展开,所以序列化一下
    console.log(JSON.stringify(ll))
    

    最后


    起源地下载网 » JavaScript实现一个链表结构源码分享

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元