package com.mxnet;
import java.util.HashSet;
public class Solution141 {
public static void main(String[] args) {
}
/**
* 给你一个链表的头节点 head ,判断链表中是否有环
* @param head
* @return
* 思路:
* 1. 使用hash结构判断链表中是否有环
* 2. 由于hash结构的元素唯一性,
* 3. 若出现重复元素,则说明链表有环
* 4. 若无重复元素,则说明链表无环
*/
public boolean hasCycle1(ListNode head) {
//若链表只有一个元素或为空,则不可能有环
if (head == null || head.next == null){
return false;
}
//使用hash结构
HashSet<ListNode> listNodes = new HashSet<>();
while (head != null){
//遍历链表所有元素,并将添加到hash集合中,若添加失败说明重复,返回true
if (!listNodes.add(head)){
return true;
}
//链表元素后移
head = head.next;
}
//若未出现重复返回false
return false;
}
/**
* 使用快慢指针的思路
* @param head
* @return
* 思路:
* 1. 使用快慢指针,定义两个指针
* 2. 快指针每次移动两步,慢指针每次移动一步,若快指针超过慢指针,说明有环
* 3. 若快指针到达链表末尾,说明无环
*/
public boolean hasCycle(ListNode head) {
//判断链表节点是否为空或只有一个元素
if (head == null || head.next == null){
return false;
}
//定义快慢指针
ListNode fast = head.next;
ListNode slow = head;
while (fast != slow){
//若快指针已经到达链表末尾,则说明无环
if (fast == null || fast.next == null){
return false;
}
//快指针移动两步,慢指针移动一步
fast = fast.next.next;
slow = slow.next;
}
return true;
}
}