用快慢指针判断链表环的原理

用快慢指针判断链表环的原理

问什么要检测链表是否有环,因为有环的话单链表就不会走到最后,会一直无限循环下去,这种结果很明显会阻塞程序,影响非常不好。

  • 如何检测有环,最暴力的方法就是记录所有的节点指针的值,如果遍历过程中发现有一样的指针就代表有环,这种方法不但耗费空间,还要花费大量的搜索的时间。

  • 另一种非常好的方法就是用快慢指针。慢指针每次只走一步,快指针每次走两步,如果有环那两个指针必定会重合。

    pslow=pslow->next;
    if(pfast->next==NULL || pfast->next->next==NULL)return false;
    pfast=pfast->next->next;
    if(pslow==pfast)return true;
    

    为什么这样会重合呢,一开始我的疑惑是为什么不会有快指针跳过慢指针的情况而是必定会重合,这应该是给比较复杂的数学证明题。直到看到了这篇博客 正面刚算法-检测链中是否有环 里的这句话,忽然恍然大悟:
    我们可以用相对“速度”来理解快、慢指针。快指针相对于慢指针,每次只移动一格,此时每次移动,快指针和慢指针间隔减少1;所以快指针必然会追上慢指针并重合

    按照相对论的观点,以慢指针pslow为参考系,或者说从慢指针pslow的视角来看,快指针pfast每次只是移动一步,当然也就不会产生跳过慢指针的情况。

    按照这个理论,那么慢指针每次走2步,快指令每次走3步也是一样的效果,而且如果没有环的话循环所要的时间可以减小,如果有环的话,会增加判断->next是否为空的时间。

参考文档:

猜你喜欢

转载自www.cnblogs.com/ljqblogs/p/12731432.html