1、题目描述
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
解法1:无限循环
/**
* 方式一:无限循环
*/
private static boolean test1 (ListNode head) {
int i = 0;
boolean fal = false;
ListNode next = head;
while (next != null) {
if (i > 10000000) {
fal = true;
break;
}
i++;
next = next.next;
}
return fal;
}
解法2:Hash表
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
if (head == null) {
return false;
}
set.add(head);
while (head.next != null) {
head = head.next;
if (set.contains(head)) {
return true;
}
set.add(head);
}
return false;
}
}
解法3:双指针
/**
* 方式三:双指针
*/
private static boolean test3 (ListNode head) {
boolean fal = false;
// 快、慢指针
ListNode index = head;
ListNode next = head;
while (next != null) {
ListNode toIndex;
if (null == index || (toIndex = index.next) == null || (index = toIndex.next) == null) {
break;
}
next = next.next;
if (next == index) {
fal = true;
break;
}
}
return fal;
}