给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。
链接:https://leetcode-cn.com/problems/linked-list-cycle/
目录
解题思路
hashSet去重
这个可以利用hashSet的特性进行去重,思路很清晰且粗暴,直接上代码。
代码
Set<ListNode> nodeSet = new HashSet<>();
while (head != null) {
if (!nodeSet.add(head)) {
return true;
}
head = head.next;
}
return false;
双指针算法
这里可以画一张图。好比两个人一起围着一条路跑,slow这个人跑的慢。quick这个人跑得快。如果链表是环形的,那么就是这么一个场景:quick跑去操场围着圈子一直跑。slow也去操场围着圈子跑,由于他们方向相同而速度不同,那么总会相遇;如果不是环形链表,那么quick跑到终点了,也就是链表指向null了还没有相遇。直接上图:
代码
public static boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode quick = head.next;
ListNode slow = head;
while (quick != slow) {
if (slow == null || quick.next == null) {
return false;
}
quick = quick.next.next;
slow = slow.next;
}
return true;
}