问题:如何判断一个单向链表是否存在循环?
这个问题反复出现在历次名企求职笔试和面试中。本人就在不同时间参加某TOP2 IT公司的笔试和面试的时候都遇到了这个问题。足见这个问题是多么的经典。
有2个方法来判断一个单向链表中是否存在循环:
算法1:该算法为步长法判断链表是否存在循环,即设两个遍历,第一个遍历步长是第二个遍历的步长的两倍,如果这两个遍历相遇(遍历到同一个节点),则单链表有环路。
int FindLoop(node *head)
{
算法1能够判断链表中是否含有循环,但是它不能准确的判断循环出现的位置。于是便有了新的算法2。在算法2中不但能够判断链表中是否含有循环,还能找出循环出现的具体位置。
算法2:当链表里当前的node的下一个node不是前面的任何一个node(包括自己),那么这个链表就不是循环链表,反之则包含了循环。
node *FindLoop(node *head)
{
Copyright 2011-2020 © MallocFree. All rights reserved.