Algorithm 弗洛伊德';s循环查找算法

Algorithm 弗洛伊德';s循环查找算法,algorithm,data-structures,Algorithm,Data Structures,在上面的代码(在考试中提问)中,问题是填充而循环,上面给出了解决方案 while条件是p=零和q=空但是我尝试了很多测试用例,发现q=空值满足算法要求,但答案严格地说是p=!零和q=空 我的问题是,q=在while条件下为null会产生问题,p=空是否需要 注意:由于这是一个基于算法的问题,请忽略语法问题…原则上,您可以只检查(由您,q而不是p)是否为NULL,就好像列表是非循环的,p永远不会在q之前 不过,除此之外,您问题中的代码还有一些小问题。(首先,它是如何在大写和小写之间交替的,这很烦人

在上面的代码(在考试中提问)中,问题是填充
循环,上面给出了解决方案

while条件是
p=零和q=空
但是我尝试了很多测试用例,发现
q=空值
满足算法要求,但答案严格地说是
p=!零和q=空

我的问题是,
q=在while条件下为null会产生问题,
p=空
是否需要


注意:由于这是一个基于算法的问题,请忽略语法问题…

原则上,您可以只检查(由您,
q
而不是
p
)是否为
NULL
,就好像列表是非循环的,
p
永远不会在
q
之前

不过,除此之外,您问题中的代码还有一些小问题。(首先,它是如何在大写和小写之间交替的,这很烦人。)正如wildplasser正确地指出的,当
head==NULL
时,存在未定义的行为

以下是一个版本,利用了您只检查兔子的想法:

P=head;
Q=head->next;
while( (p!=null) && (q!=null) )
{
    if(p==q) exit(0); // loop detected
    P=p->next;
    q=(q->next)?(q->next->next):q->next;
}

由于
q
在列表中的前进速度比
p
快,因此它总是先到达列表的末尾。
p
将永远为空的唯一方法是列表一开始为空

该代码对于空列表不正确,因为它试图访问空指针。您可以轻松地解决此问题:

p = q = head;
while(q != NULL) {
    if(p == q)
        return true;
    if(q->next == NULL)
        return false;
    p = p->next;
    q = q->next->next;
}
return false;

请不要根据外部存储的图像提问。如果外部图像发生变化或下降,您的问题将毫无意义。我已将图像中的代码添加到问题中。请仔细检查它是否正确accurate@CDspace对你有好处@Ami问题出现在第一个帖子评论队列中。另外,如果这正是他测试的代码,那么我想我马上就看到了问题(假设C)第二行
Q=head->nexthead
恰好为空(这是可能的),则code>将失败。我也有相同类型的已更正代码,但只是想知道是否存在
q=NULL不能满足while循环的需要,而且需要
p=空&q=空
。。。这是一道考试题。。因此,请容忍code@Lotus除了这些小问题,我同意你的逻辑(在回答中如此写道)。
P=head;
Q=head?head->next:null;