В то время как Условие используется в алгоритме нахождения цикла Флойда

0

Я могу понять основной принцип работы алгоритма поиска циклов Floyd. Единственное, что я не могу понять, это условие цикла while, которое приведено ниже:

while(slow && fast && fast->next){
        slow = slow->next;
    /*Moving fast pointer two steps at a time */
        fast = fast->next->next;
        if(slow == fast){
                loop_found = 1;
                break;
        }

}

Так как fast->next будет двигаться быстрее всего и станет NULL в первую очередь. Почему мы не можем просто положить fast->next в while цикла. Выполняя это, я буду отсутствовать при некоторых граничных условиях?

while(fast->next) instead of  'while(slow && fast && fast->next)'

Я написал ниже код, и он отлично работал для четного и нечетного упорядоченного линейного связанного списка. Итак, нужно fastPtr условие fastPtr в цикле while только для empty linked list check. Пожалуйста, просветите.

void linklist::detect()
{
    node * fastPtr = new node;
    node * slwPtr = new node;
    slwPtr = head;
    fastPtr = head;
    while (/*slwPtr!=NULL && fastPtr!=NULL &&*/ fastPtr->next!=NULL)
    {
        fastPtr = fastPtr->next->next;
        slwPtr = slwPtr->next;
        if (fastPtr == slwPtr)
        {
            cout << "Loop Detected\n";
            break;
        }

    }

}
Теги:
algorithm

1 ответ

4
Лучший ответ

Рассмотрим пустой список, где slow и fast имеют значение NULL. Нам требуются нулевые проверки. Из-за того, что вы указали, мы можем избежать медленной проверки нуля.

while(fast && fast->next) //This should do.

Учитывая ваше решение, мы закончим с Segmentation Fault из-за разыменования нулевых указателей.

Проверка времени добавляется, чтобы проверить, не является ли узел NULL, как в этих сценариях:

  • Пустой Связанный список. fast = NULL.
  • Линейный список, т.е. без петель (2 узла). Consider a linked list 1->2->NULL First iteration: fast = 1 and gets modified as fast =NULL Second iteration: Segmentation fault for while(fast->next)
  • 0
    Таким образом, это означает, что быстрая часть предназначена только для проверки пустого списка ссылок. Если этим случаем можно пренебречь, тогда мы будем рады использовать while (fast-> next) .
  • 1
    проверка пустого узла. Это может быть в двух случаях. Когда у вас есть пустой связанный список или линейный связанный список без петель.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню