【问题标题】:Cycle remove from linklist gives segmentfault从链接列表中删除循环会导致段错误
【发布时间】: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 始终为真。在那个循环中,rabtur 以相同的速度前进,但通常从不同的位置开始。如果巧合的是,循环恰好在head 闭合,rabtur 从一开始就相等,那么temp 永远不会被赋予除null 以外的值,并且temp->next=NULL 表现出未定义的行为。
  • 但是根据弗洛伊德算法,我们发现这样的循环开始。
  • 要么你误解了算法,要么实现了错误。
  • 第一次看到一个指针移动得更快,在我们得到会议节点后,两个节点都以相同的速度从头部开始,一个从会面点开始,以找到循环的起始节点。在这里我试图删除找到它之后。请告诉我在哪里弄错了。我被困了很长时间。
  • 啊,我明白了。该错误仅在汇合点为head、循环为o-形而不是b-形时出现。在这种情况下,tur == headrab == tur 从一开始就不会执行第二个while 循环,并且temp 永远不会分配非空值。

标签: c++ linked-list dsa


【解决方案1】:

如果我们把输入当作

4
1 2 3 4
1

然后它会显示分段错误。
原因:如果你在这个特定的测试用例上运行代码,那么在运行第一个 while 循环之后,tur 和 rab 都将指向列表的头部。现在 if 循环中的 while 循环条件将始终返回 false。之后,下一行 temp->next=NULL 的代码将给出错误,因为 temp 最初为 NULL 并且此行将表现出未定义的行为。
正确的程序应该是:

void removeLoop(Node* head)
{
    Node* rab=head;
    Node* tur=head;
    
    while (rab && rab->next) {
        rab = rab->next->next;
        tur = tur->next;
 
        if (rab == tur)
            break;
    }
 
    if (tur == rab)
    {
        tur = head;
           
        if(tur == rab) {
            while(rab->next != tur) rab = rab->next;
        }
        else {
            while (tur->next != rab->next) {
                rab = rab->next;
                tur = tur->next;
            }
        }
 
        rab->next = NULL;
    }
}

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2021-11-14
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多