c语言判断链表是否有环

判断链表中是否有环

bool hasCycle(struct ListNode *head) {
    if(head==NULL||head->next==NULL)
    return false;
    struct ListNode *fast=head->next,*slow=head;
    while(fast!=slow)
    {
        if(fast==NULL||fast->next==NULL)
        return false;
         fast=fast->next->next;//为什么
        slow=slow->next;//这两行和上面循环体中的两行互换后是错误的?
    }
    return true;
}

你的代码使用了快慢指针的方法来判断链表是否有环。这个方法的基本思想是创建两个指针,一个快指针(每次移动两步)和一个慢指针(每次移动一步)。如果链表中存在环,那么快指针和慢指针最终会相遇;如果链表中不存在环,那么快指针会首先到达链表的末尾。

你的问题是为什么fast=fast->next->next;slow=slow->next;这两行代码不能和上面的循环体中的两行代码互换位置。这是因为在循环体的开始,你需要首先检查fastfast->next是否为NULL。如果你先移动了fastslow,然后再检查fastfast->next是否为NULL,那么当链表中不存在环时,你可能会试图访问NULL节点的next属性,这会导致程序崩溃。

换句话说,你需要首先确保fastfast->next不是NULL,然后才能安全地移动fastslow。这就是为什么你不能将fast=fast->next->next;slow=slow->next;这两行代码和上面的循环体中的两行代码互换位置的原因。

没看懂你到底想要谁和谁交换
一共就只有这两句赋值,前面都是判断呀
如果你是想问9,10两行为什么不能写到7,8两行的前面
那肯定得先判断后赋值呀,不能上来先赋值啊
你都不知道指针是不是空就给指针赋值next,不是野指针吗

如果链表有环,快指针会先后追上慢指针。
如果链表无环,快指针会最终遇到链表尾部NULL而退出。
函数中快慢指针前进的逻辑是 快指针每次前进两个节点(fast = fast->next->next)
慢指针每次前进一个节点(slow = slow->next)如果互换这两行代码的顺序,会导致错误的结果。因为如果互换顺序,变为:
慢指针先前进一个节点
快指针再前进两个节点
在这种情况下,如果链表本来就很短,快指针有可能在慢指针移动的那一步就追上了尾部NULL,从而错误的判断链表无环。

两行代码互换位置,即先移动慢指针再移动快指针,会导致在链表没有环的情况下陷入死循环。因为快指针可能会一直追赶慢指针,而没有机会判断链表是否有环。

如果将尾结点的next指针指向其他的任何一个结点,那么就存在一个环。 快慢指针

ListNode*slow=head;
ListNode*fast=head;
while(fast!=nullptr)
{
    fast=fast->next;
    if(fast!=nullptr)
    {
        fast=fast->next;
    }
    if(fast==slow)
    {
        return true;
    }
    slow=slow->next;
}
return nullptr;