编辑代码

const findFirstNode = (nodeList)=>{
    //TODO write your impl here
    class NodeList {
        // nodeList
        // nodes = new Map() // 正向链表
        // nodes_reverse = new Map() // 反向链表
        // size = 0
        //
        // firstNode // 头结点
        // lastNode // 尾结点
        //
        // count = 0
        // count_reverse = 0
        // error = false
        // errorMsg = ''

        constructor (nodeList) {
            this.nodes_reverse = new Map()
            this.nodes = new Map()
            this.count = 0
            this.count_reverse = 0
            this.error = false
            
            this.nodeList = nodeList
            this.size = nodeList.length
            for (let v of nodeList) {
                this.nodes.set(v.id, v.nextId)
                this.nodes_reverse.set(v.nextId, v.id)
            }
            this.ergodicNode()
        }
        getPreNode (id) { // 递归查询上一个节点
            if (this.nodes_reverse.has(id)) {
                this.count_reverse++
                return  this.getPreNode(this.nodes_reverse.get(id))
            } else {
                return id
            }
        }
        getNext (id) { // 递归查询下一个节点
            if (this.nodes.has(id)) {
                this.count++
                return this.getNext(this.nodes.get(id))
            } else {
                return id
            }
        }

        ergodicNode () {
            try {
                let result = this.getNext(this.nodeList[0].nextId) //正向结果
                let result_reverse = this.getPreNode(this.nodeList[0].id) // 反向结果
                if(this.count_reverse+this.count+1 === this.size){
                    this.firstNode = {
                        id: result_reverse,
                        nextId: this.nodes.get(result_reverse)
                    }
                    this.lastNode = {
                        id: result,
                        nextId: this.nodes.get(result)
                    }
                }else {
                    this.error = true
                    this.errorMsg = '有节点不在链表内'
                    console.error('有节点不在链表内')
                }
            } catch (error) {
                // 闭环会导致递归超出报错
                this.error = true
                this.errorMsg = '输入错误的链表'
                console.error('输入错误的链表:',error)
            }
        }
    }
    const list = new NodeList(nodeList)
    return list.error?list.errorMsg:list.firstNode.id;
}
const list = [{"id":3,"nextId":0},{"id":1,"nextId":2},{"id":2,"nextId":3}];
//输出 1
console.log(findFirstNode(list));