zoukankan      html  css  js  c++  java
  • 链表

    Node.js自定义链表

    链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是每一个结点(数据存储单元)里存放下一个结点的信息(即地址)

    方法介绍:

    . is_empty():链表是否为空
    
    . length():链表长度
    
    . travel():遍历整个链表
    
    . add(item):链表头部添加元素
    
    . append(item):链表尾部添加元素
    
    . insert(pos, item):指定位置添加元素
    
    . remove(item):删除节点
    
    . search(item):查找节点是否存在
    
    . reverse():  链表倒置
    

    代码:

    class Node {
        // 节点
        constructor(item) {
            this.item = item
            this.next = null
        }
    }
    
    
    class Link {
        // 链表
        constructor() {
            this._head = null
        }
    
        add(item) {
            // 添加元素
            let node = new Node(item)
            node.next = this._head
            this._head = node
        }
    
        travel() {
            // 遍历
            let cur = this._head
            while (cur) {
                console.log(cur.item)
                cur = cur.next
            }
        }
    
        isEmpty() {
            return this._head === null
        }
    
        length() {
            // 长度
            let count = 0
            let cur = this._head
            while (cur) {
                count += 1
                cur = cur.next
            }
            return count
        }
    
        append(item) {
            // 向链尾添加元素
            let node = new Node(item)
            if (this._head === null) {
                this._head = node
                return
            }
    
            let pre = null
            let cur = this._head
            while (cur) {
                pre = cur
                cur = cur.next
            }
            // 当while循环结束的时候,pre就指向了链表中最后一个节点
            pre.next = node
        }
    
        insert(pos, item) {
            // 将item对应的节点插入到pos指定的位置中
            let node = new Node(item)
            if (pos === 0) {
                node.next = this._head
                this._head = node
                return
            }
    
            let cur = this._head
            let pre = null
            for (let i = 0; i < pos; i++) {
                pre = cur
                cur = cur.next
            }
    
            pre.next = node
            node.next = cur
    
        }
    
        remove(item) {
            // 删除节点
            if (this._head && this._head.item === item) {
                this._head = this._head.next
                return
            }
    
            let cur = this._head
            let pre = null
            while (cur) {
                pre = cur
                cur = cur.next
                if (cur.item === item) {
                    pre.next = cur.next
                    return;
                }
            }
    
        }
    
        search(item) {
            // 查询某个节点是否存在
            let cur = this._head
            while (cur) {
                if (cur.item === item) {
                    return true
                }
                cur = cur.next
            }
            return false
        }
    
        reverse() {
            // 链表倒置
            let pre = this._head
            let cur = pre.next
            let next_node = cur.next
    
            pre.next = null  // 链表倒置后pre就是最后一个节点,最后一个节点的next指向None
    
            while (1) {
                cur.next = pre
                pre = cur
                cur = next_node
    
                if (next_node !== null) {
                    next_node = next_node.next
                } else {
                    break
                }
            }
    
            this._head = pre
    
        }
    
    }
    
    link = new Link()
    link.add(1)
    link.add(2)
    link.add(3)
    link.add(4)
    link.add(5)
    link.insert(0, 0)
    link.remove(0)
    link.reverse()
    link.travel()
    console.log(link.isEmpty())
    console.log(link.length())
    
    
  • 相关阅读:
    智慧园区数字孪生平台GIS+三维可视化的研究
    树莓派联通家庭宽带端口映射
    NetCore 5.0 Dokcer中发布报NU3028、NU3037
    django导入导出excel实践
    MySQL JSON类型
    业务、设计模式、算法
    VIM 简单教程
    k8s go-client 使用简介
    如何健壮你的后端服务
    公共dto打包时按条件导出实现feignclient接口的bean,解决feign.Feign$Builder类找不到的问题
  • 原文地址:https://www.cnblogs.com/ghh520/p/15068410.html
Copyright © 2011-2022 走看看