题目
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回 true 。 否则,返回 false 。
示例
输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。
快慢指针实现
主要思路
- 如果链表有环,慢指针每次走一步,快指针每次走两步
- 快慢指针最终会相遇
- 如果链表没有坏,快指针最终会为null,然后结束while循环
代码
public boolean hasCycle(ListNode head) {
if(head == null){
return false
}
ListNode slow = head
ListNode fast = head
while(fast != null && fast.next != null){
slow = slow.next
fast = fast.next.next
if(slow ==fast){
return true
}
}
return false
}
Set集合实现
主要思路
- 主要利用Set集合不存储重复元素的特点
- 遍历链表节点,将节点添加到Set集合中
- 在添加节点时,先判断节点是否已经在Set集合里
- 如果存在,说明有环
- 如果不存在,就将节点添加到集合中
代码
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
Set<ListNode> set = new HashSet<>();
while(head != null){
if(set.contains(head)){
return true;
}
set.add(head);
head = head.next;
}
return false;
}