这是我参与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 ;
}
复制代码
如上图所示post
也就是说,slow每次向前走一步,fast向前追了两步,所以每一步操做后fast到slow的距离缩短了1步,这样继续下去就会使得二者之间的距离逐渐缩小:...、五、四、三、二、一、0 -> 相遇。又由于在同一个环中fast和slow之间的距离不会大于换的长度,所以到两者相遇的时候slow必定尚未走完一周(或者正好走完之后,这种状况出如今开始的时候fast和slow都在环的入口处)。学习
想要学习更多算法问题,或者要更多项目源码,请移步到公众号:诗同样的代码。spa
既然进来了,原创不易。小伙伴点个赞再走呗。指针