检查时floyd的循环查找算法

时间:2016-10-05 20:11:47

标签: algorithm data-structures

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;
}

Floyd's Alogorithm

在上面的代码中(在考试中询问),问题是填写while循环并且上面给出了解决方案

while条件为p!=NULL AND q!=NULL,但我尝试了很多测试用例,发现q!=NULL足够算法,但答案是严格p=!NULL AND q!=null

我的问题是,何时q!=null处于while状态会产生问题,何时需要p!=NULL

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

2 个答案:

答案 0 :(得分:1)

原则上,您确定只能检查"hare" and not "tortoise"(由您,q而不是p){{1如果列表是acylic,NULL永远不会超过p

除了这个问题之外,你问题中的代码还存在一些小问题。 (令人讨厌如何在大写和小写之间交替使用。)正如wildplasser正确指出的那样,q时存在未定义的行为。

这是一个利用你只检查野兔的想法的版本:

head == NULL

答案 1 :(得分:0)

由于qp更快地沿着列表前进,因此始终 首先到达列表的末尾。 p将为空的唯一方法是,如果列表开头是空的。

空列表的代码不正确,因为它尝试访问空指针。你可以轻松解决这个问题:

P=head;
Q=head?head->next:null;