Вопрос:

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

В связанном списке есть цикл, если в списке есть некоторый узел, к которому можно снова обратиться, непрерывно следуя указателю next. Внутри pos используется для обозначения индекса узла, к которому подключен указатель хвоста next. Обратите внимание, что pos не передается в качестве параметра.

Вернуть true, если в связанном списке есть цикл. В противном случае вернуть false.

Пример 1:

Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).

Решение:

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

Мы решим это методом двух указателей. Во-первых, мы сделаем два указателя: медленный и быстрый. медленныйуказатель будет увеличен на одну позицию, а быстрыйуказатель будет увеличен на две позиции.

ListNode* slow = head;
ListNode* fast = head;

Теперь мы проверим, пуст ли список, и если да, то вернем false, так как в списке не будет цикла без элементов.

if(head == NULL)
    return false;

Следующим шагом является обход списка до тех пор, пока быстрыйуказатель не достигнет null или конца списка. медленный и быстрыйуказатель будут увеличены на одну и две позиции соответственно.

При обходе мы должны проверить, равны ли медленный и быстрыйуказатель, тогда мы вернем true. Если оба указателя равны, то ясно, что список содержит цикл.

while(fast != NULL && fast -> next != NULL)
{
    slow = slow -> next;
    fast = fast -> next -> next;
    
    if(slow == fast)
        return true;
}

В противном случае вернуть ложь.

Ниже приведен полный код данной проблемы:

Спасибо за прочтение!

S.