力扣:141. 环形链表 - 力扣(LeetCode) (leetcode-cn.com)
目录
题目:
判断链表中是否有环
分析:
1.如果是首尾相连,我们只需要重新定义一个新结点,让新结点一步步走下去与原结点的地址相比较,若相同,则知道此链表带环。
2.当最后一个结点的next不为头结点时,那上述方法就不成,因为我们并不知道最后一个结点的next指向第几个:在这里可以利用带环链表的死循环来解决问题。
思路:
定义两个指针:快慢指针slow和fast
slow每次走一步,fast每次走两步,fast先进环,当slow进环时,在一圈内,fast与slow必会相遇,此时slow和fast相等,那么就可以证明此链表是一个带环结构。
最长步数图解:
若slow和fast不可能相等,那么肯定不是循环的链表,那么一定不带环。
由上述分析,我们就可以写代码了。
代码:
bool hasCycle(struct ListNode *head) {
struct ListNode* fast,*slow;
fast=slow=head;
//没环不可能死循环
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
if(slow==fast)
{
return true;
}
}
return false;
}
注意:while中的条件
fast&&fast->next
根据实际情况,我们知道first先走,走两步,那么fast和fast->next不能为NULL;空不能调用next,程序会崩掉,要注意!!!