Я могу понять основной принцип работы алгоритма поиска циклов 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;
}
}
}
Рассмотрим пустой список, где slow и fast имеют значение NULL. Нам требуются нулевые проверки. Из-за того, что вы указали, мы можем избежать медленной проверки нуля.
while(fast && fast->next) //This should do.
Учитывая ваше решение, мы закончим с Segmentation Fault
из-за разыменования нулевых указателей.
Проверка времени добавляется, чтобы проверить, не является ли узел NULL, как в этих сценариях:
fast = NULL
.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)