编辑代码

// 栈stack
class Stack {
    constructor() {
        this.stack = []
    }
    push(item) {
        this.stack.push(item)
    }
    pop() {
        this.stack.pop()
    }
    // 栈顶元素
    peek() {
        const len = this.stack.length
        return this.stack[len - 1]
    }
    isEmpty() {
        return this.stack.length === 0
    }
    size() {
        return this.stack.length
    }
}

// 队列Queue
class Queue {
    constructor() {
        this.queue = []
    }
    // 向尾部添加元素
    enquene(item) {
        this.queue.push(item)
    }
    // 从头部移除元素并返回移除的元素
    dequeue() {
        return this.queue.shift()
    }
    // 返回头部元素
    front() {
        return this.queue[0]
    }
    isEmpty() {
        return this.queue.length === 0
    }
    size() {
        return this.stack.length
    }
}

// 单向链表
class Node {
    constructor(item) {
        this.item = item
        this.next = null
    }
}
class LinkedList {
    constructor() {
        this.head = null
        this.length = 0
    }
    append(item) {
        const node = new Node(item)
        let current
        if (!this.head) {
            this.head = node
        } else {
            current = this.head
            while (current.next) {
                current = current.next
            }
            current.next = node
        }
        this.length++
    }
    insert(item, index) {
        if (index < 0 || index > this.length) return false
        const node = new Node(item)
        if (index === 0) {
            node.next = this.head
            this.head = node
        } else {
            let prev
            let current = this.head
            let i = 0
            while (i++ < index) {
                prev = current
                current = current.next
            }
            prev.next = node
            node.nextSibling = current
        }
        this.length++
        return true
    }
    removeAt(index) {
        if (index < 0 || index > this.length) return false
        if (index === 0) {
            this.head = this.head.next
        } else {
            let current = this.head
            let prev, i
            while (i++ < index) {
                prev = current
                current = current.next
            }
            prev.next = current.next
        }
        this.length--
        return current.item
    }
    remove(element) {
        let index = this.find(element)
        // 删除后返回已删除的节点
        return this.removeAt(index)
    }

    find(element) {
        let current = this.head
        let index = 0
        if (element == current.element) {
            return 0;
        }
        while (current.next) {
            if (current.element === element) {
                return index
            }
            index++
            current = current.next
        }
        if (element == current.element) {
            return index;
        }
        return -1
    }

    isEmpty() {
        return this.length === 0
    }

    size() {
        return this.length
    }

    print() {
        let current = this.head
        let result = ''
        while (current) {
            result += current.element + (current.next ? '->' : '')
            current = current.next
        }
        return result
    }

}