Циклический связанный список — это особый тип связанного списка, последний узел которого указывает на корневой узел.

Итак, чтобы проверить, является ли связанный список циклическим или нет, нам нужно перейти к последнему узлу и проверить, равен ли он следующему корневому узлу.

Давайте напишем метод, который будет брать связанный список и выяснять, циклический он или нет —

function isCyclic(list) {
    let current = list.root
    while (current != null && current.next != null) {
        if (current.next.data === list.root.data) {
            return true;
        }
        current = current.next;
    }
    return false;
}

Теперь давайте создадим простой связанный список, циклический связанный список и проверим его на цикличность.

class Node {
    constructor(value) {
        this.data = value;
        this.next = null;
    }
}
class CyclicLinkedList {
    add(value) {
        let node = new Node(value);
        let current = this.root;
        if (current == null) {
            this.root = node;
        } else {
            while (current.next != null && current.next.data != this.root.data) {
                current = current.next;
            }
            node.next = this.root;
            current.next = node;
        }
    }
}
class LinkedList {
    add(value) {
        const node = new Node(value);
        let current = this.root;
        if (current == null) {
            this.root = node;
        } else {
            while (current.next != null) {
                current = current.next;
            }
            current = current.next;
        }
    }
}
function isCyclic(list) {
    let current = list.root
    while (current != null && current.next != null) {
        if (current.next.data === list.root.data) {
            return true;
        }
        current = current.next;
    }
    return false;
}
const cylicList = new CyclicLinkedList();
cylicList.add(1);
cylicList.add(2);
cylicList.add(3);
const list = new LinkedList();
cylicList.add(1);
cylicList.add(2);
cylicList.add(3);
console.log("isCyclic", isCyclic(cylicList)); //true
console.log("isCyclic", isCyclic(list)); // false