【面试经典题】判断链表是否有环| 8月更文挑战

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战面试

想要坚持写点什么,那干脆写一个系列吧。想一想有什么能够写的呢?程序=算法+数据结构,可见算法的重要性。这个系列老诗力求用最简单的语言把算法讲得明明白白,由浅到深,有兴趣的话,能够关注一下专栏。算法

上一篇文章写了链表的基本操做,包括新建链表,插入链表节点,删除链表节点,查询链表结点等内容。 如今这一篇是讲如何判断链表是否有环的算法。面试中这一题目是比较常见的。markdown

快慢指针判断法

对于这个问题咱们能够采用“快慢指针”的方法。就是有两个指针fast和slow,开始的时候两个指针都指向链表头head,而后在每一步操做中slow向前走一步即:slow = slow->next,而fast每一步向前两步即:fast = fast->next->next。因为fast要比slow移动的快,若是有环,fast必定会先进入环,而slow后进入环。当两个指针都进入环以后,通过有限的操做次数以后,快慢指针是一定会相遇的。数据结构

具体代码以下:oop

//快慢指针判断是否有环 
bool exitLoop(Node *head) 
{ 
    Node *fast, *slow ; 
    slow = fast = head ; 
   
    while (slow != NULL && fast -> next != NULL) 
    { 
        slow = slow -> next ; 
        fast = fast -> next -> next ; 
        if (slow == fast) 
            return true ; 
    } 
    return false ; 
} 
复制代码

22222.png

如上图所示post

也就是说,slow每次向前走一步,fast向前追了两步,所以每一步操做后fast到slow的距离缩短了1步,这样继续下去就会使得二者之间的距离逐渐缩小:...、五、四、三、二、一、0 -> 相遇。又由于在同一个环中fast和slow之间的距离不会大于换的长度,所以到两者相遇的时候slow必定尚未走完一周(或者正好走完之后,这种状况出如今开始的时候fast和slow都在环的入口处)。学习

想要学习更多算法问题,或者要更多项目源码,请移步到公众号:诗同样的代码spa

既然进来了,原创不易。小伙伴点个赞再走呗指针

相关文章
相关标签/搜索