【发布时间】:2021-07-25 07:19:02
【问题描述】:
void removeLoop(Node* head)
{
// code here
// just remove the loop without losing any nodes
Node* rab=head;
Node* tur=head;
while(rab && rab->next)
{
rab=rab->next->next;
tur=tur->next;
if(tur==rab)
break;
}
Node* temp=NULL;
if(rab && rab->next)
{
rab=head;
while(rab!=tur)
{
rab=rab->next;
temp=tur;
tur=tur->next;
}
temp->next=NULL;
}
}
这是我使用弗洛伊德算法实现的代码。
问题链接 https://practice.geeksforgeeks.org/problems/remove-loop-in-linked-list/1#
提交时出现段错误,无法识别它失败的特定测试用例
根据问题无需返回任何东西。
【问题讨论】:
-
据我所知,第二个循环将永远运行,条件
rab != tur始终为真。在那个循环中,rab和tur以相同的速度前进,但通常从不同的位置开始。如果巧合的是,循环恰好在head闭合,rab和tur从一开始就相等,那么temp永远不会被赋予除null 以外的值,并且temp->next=NULL表现出未定义的行为。 -
但是根据弗洛伊德算法,我们发现这样的循环开始。
-
要么你误解了算法,要么实现了错误。
-
第一次看到一个指针移动得更快,在我们得到会议节点后,两个节点都以相同的速度从头部开始,一个从会面点开始,以找到循环的起始节点。在这里我试图删除找到它之后。请告诉我在哪里弄错了。我被困了很长时间。
-
啊,我明白了。该错误仅在汇合点为
head、循环为o-形而不是b-形时出现。在这种情况下,tur == head和rab == tur从一开始就不会执行第二个while循环,并且temp永远不会分配非空值。
标签: c++ linked-list dsa