const findFirstNode = (nodeList)=>{
class NodeList {
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}];
console.log(findFirstNode(list));