题目描述
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
测试样例
示例1:
输入:head = [3,2,0,-4], pos = 1 输出:true
示例2:
输入:head = [1,2], pos = 0 输出:true
示例3:
示例 3:
输入:head = [1], pos = -1 输出:false
解析
本题可以采用Floyd判圈法来求解,Floyd判圈法可以解决的问题有:1、判断是否有环;2、计算环的长度。
具体的算法思想是采用快慢指针的思想:
1、判断是否有环
设两个指针slow和fast,初始位置都在链表的头节点处,使slow每次向后移动一步,fast每次向后移动两步,若fast在到达链表尾部前slow与fast相遇了,就说明链表有环。这也很容易想明白,假如链表没有环的话,slow是不可能追得上fast的,所以只要slow和fast相遇,就能说明链表中有环。
2、计算环的长度
同1,当判断链表中存在环之后,让fast指针再次从头节点开始,每次向后一步,slow指针也每次向后移动一步,二者再次相遇时fast指针走的长度即为环的长度。这里的原因也很简单,因为当slow和fast第一次相遇时,slow和fast必定在环上,所以只要让一者不动,另一者走一圈直到相遇,走过的节点数就是环的长度。
题解
ListNode* fast = head;
ListNode* slow = head;
while(fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
// 快慢指针相遇,说明有环
if (slow == fast)
return true;
}
return false;
题目链接:https://leetcode.cn/problems/linked-list-cycle/