Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在弗洛伊德';循环检测的s算法如果我们取快为头。下一步的解会出错吗?_C++_Linked List_Floyd Cycle Finding - Fatal编程技术网

C++ 为什么在弗洛伊德';循环检测的s算法如果我们取快为头。下一步的解会出错吗?

C++ 为什么在弗洛伊德';循环检测的s算法如果我们取快为头。下一步的解会出错吗?,c++,linked-list,floyd-cycle-finding,C++,Linked List,Floyd Cycle Finding,因此,我解决了leetcode的问题,我们必须返回尾部连接的节点,但当我选择fast=head->next时,解决方案出现了错误,而当我选择fast=head时,解决方案是正确的。我知道后者是正确的,但我不太明白为什么 示例: 输入:头部=[3,2,0,-4],位置=1 输出:tail连接到节点索引1 错误代码 ListNode *slow = head, *fast = head->next; while(fast && fast->next) {

因此,我解决了leetcode的问题,我们必须返回尾部连接的节点,但当我选择
fast=head->next
时,解决方案出现了错误,而当我选择
fast=head
时,解决方案是正确的。我知道后者是正确的,但我不太明白为什么

示例: 输入:头部=[3,2,0,-4],位置=1 输出:tail连接到节点索引1

错误代码

ListNode *slow = head, *fast = head->next;
    
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        
        if(slow == fast)
            break;
    }
    if(fast == NULL || fast->next == NULL){
        return NULL;
    }
    slow = head;
    while(fast != slow){
        slow = slow->next;
        fast = fast->next;
    }
    return fast;
ListNode *slow = head, *fast = head;
    
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        
        if(slow == fast)
            break;
    }
    if(fast == NULL || fast->next == NULL){
        return NULL;
    }
    slow = head;
    while(fast != slow){
        slow = slow->next;
        fast = fast->next;
    }
    return fast;
正确的代码

ListNode *slow = head, *fast = head->next;
    
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        
        if(slow == fast)
            break;
    }
    if(fast == NULL || fast->next == NULL){
        return NULL;
    }
    slow = head;
    while(fast != slow){
        slow = slow->next;
        fast = fast->next;
    }
    return fast;
ListNode *slow = head, *fast = head;
    
    while(fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        
        if(slow == fast)
            break;
    }
    if(fast == NULL || fast->next == NULL){
        return NULL;
    }
    slow = head;
    while(fast != slow){
        slow = slow->next;
        fast = fast->next;
    }
    return fast;

你可能会在这方面找到一些线索。我相信这和数学有关,数学给了你循环的起点。这能回答你的问题吗?