SOURCE

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

class LinkedList {
    constructor() {
        this.head = null
        this.length = 0
    }

    static createNode(value) {
        return new Node(value)
    }

    printList () {
        console.log("List start")
        let node = this.head
		let k = 0
        while (node != null && k < this.length) {
            console.log(node.value)
            node = node.next
			k ++
        }
        console.log("List end")
    }
}

function circleStartInLinkedlist (list) {
    if(list.head == null) return null
    let fastPointer = slowPointer = list.head
    while ((fastPointer != null) && (fastPointer.next != null)) {
        fastPointer = fastPointer.next.next
        slowPointer = slowPointer.next
        if (fastPointer == slowPointer) 
            break
    }
    if (fastPointer == slowPointer) {
        slowPointer = list.head
        while (fastPointer != slowPointer) {
            fastPointer = fastPointer.next
            slowPointer = slowPointer.next
        }
        return slowPointer
    } else {
        return null
    }
}

function testCircleInList ( ) {
    let list = new LinkedList()
    list.head = LinkedList.createNode(0)
    let tmpNode = list.head
    list.length ++
    tmpNode.next = LinkedList.createNode(1)
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = LinkedList.createNode(2)
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = LinkedList.createNode(3)
    let node3 = tmpNode.next
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = LinkedList.createNode(4)
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = LinkedList.createNode(5)
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = LinkedList.createNode(6)
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = LinkedList.createNode(7)
    tmpNode = tmpNode.next
    list.length ++
    tmpNode.next = node3

    // list.printList()

    let circleStartNode = circleStartInLinkedlist(list)
    console.log("List circle start at -->  " + circleStartNode.value)
}

testCircleInList();


console 命令行工具 X clear

                    
>
console