Определение того, содержит ли данный связанный список цикл, может оказаться сложной задачей в программировании на Java. Цикл возникает, когда последний узел в списке ссылается на предыдущий узел вместо нулевой ссылки.
Для эффективного обнаружения циклов разработчики часто используют алгоритм поиска цикла Флойда, также известный как алгоритм черепахи и зайца. . Этот алгоритм использует две ссылки, медленную и быструю, которые перемещаются по списку с разной скоростью.
Например, медленная ссылка продвигается вперед на один узел, а быстрая ссылка — на два узла. Если связанный список содержит цикл, эти ссылки в конечном итоге встретятся. С другой стороны, если цикла нет, либо медленная, либо быстрая ссылка (или их последующие ссылки) станут нулевыми до того, как другая достигнет конца списка.
Вот Java-реализация алгоритма Флойда. :
boolean hasLoop(Node first) {
if (first == null) {
return false; // List does not exist, so no loop
}
Node slow, fast; // Create two references.
slow = fast = first; // Make both refer to the start of the list.
while (true) {
slow = slow.next; // One hop.
if (fast.next != null) {
fast = fast.next.next; // Two hops.
} else {
return false; // No loop.
}
if (slow == null || fast == null) {
return false; // No loop.
}
if (slow == fast) {
return true; // Loop detected.
}
}
}
Этот алгоритм использует пространственную сложность O(1) и работает за время O(n), что делает его эффективным с точки зрения использования памяти и разумными затратами времени.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3