LinkList

65 阅读1分钟

双向链表

用来构建流程状态链表,通过 map,构建链表结构,实现流程注册及上下级切换

/**
 * @name  节点对象
 * @param data  节点数据
 * @param pre   上级节点
 * @param next  下级节点
 */
class Node {
  constructor(data, pre, next) {
    this.data = data;
    this.pre = pre;
    this.next = next;
  }
}
/**
 * @name 链表对象
 * @param headerNode 表头节点
 */
export class Linked {
    constructor(headerNode) {
        this.header = new Node(headerNode, null, null);
        this.store = new Map();
        this.store.set(headerNode.code, this.header);
    }

    /**
     * @name 插入节点
     * @param {obj} element
     * @param {str} code 状态标号('1')
     */
    insert(element, code) {
        // 替换校验
        if (this.find(element.code)) {
            throw "该节点已被占用";
        }

        // 空值校验
        if (code && !this.has(code)) {
            throw "插入点不存在";
        }

        // 默认末尾插入
        let currentNode = code ? this.find(code) : this.endNode();
        let newNode = new Node(element, currentNode, currentNode.next);
        currentNode.next = newNode;
        this.store.set(element.code, newNode);
    }

    /**
     * @name  节点是否存在
     * @param {str} code
     */
    has(code) {
        return this.store.has(code);
    }

    /**
     * @name   查询节点
     * @param  {str}  code
     * @return {Node} 返回节点
     */
    find(code) {
        return this.store.get(code);
    }

    /**
     * @name 获取末端节点
     * @return {Node} 返回末端节点
     */
    endNode() {
        let current = this.header;

        while (current.next) {
            current = current.next;
        }

        return current;
    }

    // 设置循环链表
    setLoop() {
        let endNode = this.endNode();
        this.header.pre = endNode;
        endNode.next = this.header;
    }
}