• 链表


    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())
    
    
  • 相关阅读:
    1105 Spiral Matrix (25分)(蛇形填数)
    1104 Sum of Number Segments (20分)(long double)
    1026 Table Tennis (30分)(模拟)
    1091 Acute Stroke (30分)(bfs,连通块个数统计)
    1095 Cars on Campus (30分)(排序)
    1098 Insertion or Heap Sort (25分)(堆排序和插入排序)
    堆以及堆排序详解
    1089 Insert or Merge (25分)
    1088 Rational Arithmetic (20分)(模拟)
    1086 Tree Traversals Again (25分)(树的重构与遍历)
  • 原文地址:https://www.cnblogs.com/ghh520/p/15068410.html
Copyright © 2020-2023  润新知