C++ 为什么在弗洛伊德';循环检测的s算法如果我们取快为头。下一步的解会出错吗?
因此,我解决了leetcode的问题,我们必须返回尾部连接的节点,但当我选择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) {
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;
你可能会在这方面找到一些线索。我相信这和数学有关,数学给了你循环的起点。这能回答你的问题吗?