SOURCE

class LinkedList {
    length = 0

    head = null

    Node = class {
        data
        next = null
        constructor(data) {
            this.data = data
        }
    }

    append(data) {
        const newNode = new this.Node(data)

        if (this.length === 0) {
            this.head = newNode
        } else {
            let currentNode = this.head

            while (currentNode.next !== null) {
                currentNode = currentNode.next
            }

            currentNode.next = newNode
        }

        this.length++
    }

    toString() {
        let currentNode = this.head
        let result = ''

        while (currentNode) {
            result += currentNode.data + ''
            currentNode = currentNode.next
        }

        return result
    }

    insert(position, data) {

        if (position < 0 || position > this.length) return false

        const newNode = new this.Node(data)

        if (position === 0) {
            newNode.next = this.head

            this.head = newNode
        } else {
            let currentNode = this.head
            let previousNode = null
            let index = 0
            while (index++ < position) {
                previousNode = currentNode
                currentNode = currentNode.next
            }

            newNode.next = currentNode
            previousNode.next = newNode
        }

        this.length++
        return newNode
    }

    getData(position) {
        if (position < 0 || position >= this.length) return false

        let currentNode = this.head
        let index = 0
        while (index++ < position) {
            currentNode = currentNode.next
        }

        return currentNode.data
    }

    indexOf(data) {
        let currentNode = this.head
        let index = 0
        while (currentNode) {
            if (currentNode.data === data) {
                return index
            }
            currentNode = currentNode.next
            index++
        }

        return -1
    }

    update(position, data) {
        if (position < 0 || position >= this.length) return false

        let currentNode = this.head
        let index = 0

        while (index++ < position) {
            currentNode = currentNode.next
        }

        currentNode.data = data

        return currentNode
    }

    removeAt(position) {
        if (position < 0 || position >= this.length) return false

        let currentNode = this.head
        if (position === 0) {
            this.head = this.head.next
        } else {
            let previousNode = null
            let index = 0

            while (index++ < position) {
                previousNode = currentNode
                currentNode = currentNode.next
            }

            previousNode.next = currentNode.next
        }

        this.length--

        return currentNode
    }

    remove(data) {
        this.removeAt(this.indexOf(data))
    }

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

    size() {
        return this.length
    }
}

const linkedList = new LinkedList()

linkedList.append('A')
linkedList.append('B')
linkedList.append('C')
// console.log(JSON.stringify(linkedList))
linkedList.insert(0, '123')
console.log(JSON.stringify(linkedList))
// console.log(linkedList.update(0, 'Z'))
// console.log(JSON.stringify(linkedList))
linkedList.removeAt(1)
console.log(JSON.stringify(linkedList))
console 命令行工具 X clear

                    
>
console