更简单的证明方法是考虑从第一个节点开始向下的顺序。当单链表中的节点数不超过n时,它要么在有限步中结束,要么在有限步中存在重复节点。因为单链表中的下一个节点是唯一的,所以序列有一个固定的周期。当单链表不循环时,快指针和慢指针显然不会相遇,只考虑循环。
让序列为a[n],从a[i]开始,对于任何m>=i,有一个[mt]=a[m],其中t>=1。我们只需要证明k的存在性,使得a[2k]=a[k]。取任意u,使ut>=i,k=ut,然后a[2ut]=a[ut]=a[ut(u-1)t]=。。。=a[ut],即a[2k]=a[k],证明命题
设置两个指针。一开始,他们都指向链条的头部。然后,一个指针一次向前移动一步,另一个指针一次向前移动两步。如果快速指针遇到null,则证明列表中没有环。如果有一个环,快速指针每次都会比慢速指针多走一步,最后两个指针会相遇。(注意:快速指针不会在这里跳过booljudge(list*head){if(head==null){returnfalse//noring}list*pfast=headlist*pslow=headwhile(pfastnext!=null&p上一步!=null){pfast=pfastnextpslow=pslownext
我想这段代码应该检查链表中是否有环。当两个指针相遇时,表示链表中有环。建议只联系单子,不要看这么复杂的东西,手写遍历倒什么的好。
代码是有上下文的,你不能只看一句话就能全部理解。如果查看循环语句的结束条件,至少应该查看循环中执行的操作。
当链表长度为偶数时,遍历到尾部,fast指向null,但循环不结束,否则会做出判断。此时将报告段落错误。
给定一个单链表,尝试判断单链表中是否有环。答:该算法的思想是设置两个指针p和q,其中p一次向前移动一步,q一次向前移动两步。如果单链表中有一个环,那么p和q相遇;否则,q将首先遇到null。r假设单链表的长度为n,单链表是循环的,那么在第i次迭代中,p指向元素imodn,q指向元素2imodn,所以当i≡2i(modn)时,p和q满足。当i=n,p和q满足时,i≡2i(modn)=>(2i-i)modn=0=>imodn=0=>。这里有一个简单的理解,就是p和q同时在操场上跑,q跑的速度是p的两倍,当他们两人同时出发时,p跑一圈就到了起点,q跑两圈就到了起点。如果p的起点和q的起点不同呢?假设在第i次迭代中p指向元素imodn,q指向k2imodn,其中0
单链表有一个环,这意味着单链表中某个节点的下一个指针字段指向链表中该节点之前的某个节点,从而在链表的末尾形成一个环结构。有几种方法可以判断链表是否有链接。