判断链表中是否有环
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;
这两行代码不能和上面的循环体中的两行代码互换位置。这是因为在循环体的开始,你需要首先检查fast
和fast->next
是否为NULL
。如果你先移动了fast
和slow
,然后再检查fast
和fast->next
是否为NULL
,那么当链表中不存在环时,你可能会试图访问NULL
节点的next
属性,这会导致程序崩溃。
换句话说,你需要首先确保fast
和fast->next
不是NULL
,然后才能安全地移动fast
和slow
。这就是为什么你不能将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;
链接: https://download.csdn.net/download/xiaoxiaodawei/12242402.