我进入了一个leetcode问题 (Floyd的链表周期检测算法),在该算法中,我注意到指针状态上的一个奇怪行为。当我在for循环中更改指针状态时,程序将正确执行(指针状态移动到正确的状态):
ListNode *detectCycle(ListNode *head) {
if(!head or !head->next)
return nullptr;
ListNode *slow, *fast;
for(slow = head, fast = head; fast && fast->next;)
{
slow = slow->next, fast = fast->next->next; // This hops the pointers correctly
if(slow == fast)
{
slow = head;
while(slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return nullptr;
}但是,当我在for循环定义中状态更改slow和fast时,状态更改是错误的,程序没有给出正确的输出。
ListNode *detectCycle(ListNode *head) {
if(!head or !head->next)
return nullptr;
ListNode* slow, *fast;
for(slow = head, fast = head; fast && fast->next; slow = slow->next, fast=fast->next->next) // Pointers dont hop correctly
{
if(slow == fast)
{
slow = head;
while(slow != fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return nullptr;
}我不知道是什么导致了这一切。在我看来,增加for循环定义中的指针与立即在for循环中递增指针应该是相同的。有人能洞察为什么循环中的增量指针和for循环签名中的增量指针会导致不同的行为吗?
发布于 2022-01-19 20:33:47
一个
for (init-statement; condition; iteration-expression)
{
dostuff();
}映射到
{
init-statement
while ( condition )
{
dostuff();
iteration-expression ;
}
}所以我们得到
{
slow = head, fast = head;
while (fast && fast->next)
{
slow = slow->next, fast = fast->next->next;
dostuff(); // for example purposes only. Not really replacible with a function
}
}和
{
slow = head, fast = head;
while (fast && fast->next)
{
dostuff();
slow = slow->next, fast=fast->next->next;
}
}在第一个版本中,slow和fast总是在dostuff()之前被更新。
在第二个过程中,dostuff发生在slow和fast更新之前,因此在dostuff中使用的slow和fast的值在第一个循环迭代中会有所不同。
https://stackoverflow.com/questions/70777047
复制相似问题