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;
}
在上面的代码中(在考试中询问),问题是填写while
循环并且上面给出了解决方案
while条件为p!=NULL AND q!=NULL
,但我尝试了很多测试用例,发现q!=NULL
足够算法,但答案是严格p=!NULL AND q!=null
我的问题是,何时q!=null
处于while状态会产生问题,何时需要p!=NULL
?
注意:由于这是基于算法的问题,请忽略语法问题...
答案 0 :(得分:1)
原则上,您确定只能检查"hare" and not "tortoise"(由您,q
而不是p
){{1如果列表是acylic,NULL
永远不会超过p
。
除了这个问题之外,你问题中的代码还存在一些小问题。 (令人讨厌如何在大写和小写之间交替使用。)正如wildplasser正确指出的那样,q
时存在未定义的行为。
这是一个利用你只检查野兔的想法的版本:
head == NULL
答案 1 :(得分:0)
由于q
比p
更快地沿着列表前进,因此始终 首先到达列表的末尾。 p
将为空的唯一方法是,如果列表开头是空的。
空列表的代码不正确,因为它尝试访问空指针。你可以轻松解决这个问题:
P=head;
Q=head?head->next:null;