题目描述
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。
示例
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
解题思路
1.快慢指针法
若存在环最终快慢指针会相遇;若不存在环,那么快指针一定会先走到链表尾部。满足空间复杂度为O(1)
java代码如下:
public boolean hasCycle(ListNode head) {
// if(head == null){
// return false;
// } //去掉也可
ListNode node1 = head,node2 = head; //node1为快指针,node2为慢指针
//如果有环,while循环内条件将一直满足,直到两指针相遇,返回true
while (node1 != null && node1.next != null && node2 != null){
node1 = node1.next.next;
node2 = node2.next;
if(node1 == node2){
return true;
}
}
//如果没有环总会打破while循环,直接返回false即可
return false;
}
运行结果如下:
2.哈希表法
我们可以通过检查一个结点此前是否被访问过来判断链表是否为环形链表。只是不满足空间复杂度为O(1)
java代码如下:
public boolean hasCycle1(ListNode head) {
Set<ListNode> nodesSet = new HashSet<>();
while (head != null) {
if (nodesSet.contains(head)) {
return true;
} else {
nodesSet.add(head);
}
head = head.next;
}
return false;
}
运行结果如下: