1. 环形链表
public class HasCycle141 {
//定义一个单链表
public class ListNode {
int val; //当前节点值
ListNode next; //下一个节点值
//构造方法 初始化当前节点值
ListNode(int x) {
val = x;
next=null;
}
}
/**环形链表(链表尾连接到链表中的位置)
*方法1:哈希表 时间复杂度 O(n)
* @param head 带操作链表
* @return 是环形链表返回true;否则返回false
*
* 注:哈希表:数组 + 链表
* HashSet 和 HashMap 区别:HashSet只储存对象;HashMap存储键值对
*/
public boolean hasCycle01(ListNode head) {
Set<ListNode> nodesSeen = new HashSet<>();
while (head != null) {
if (nodesSeen.contains(head)) {
return true;
} else {
nodesSeen.add(head);
}
head = head.next;
}
return false;
}
/**环形链表(链表尾连接到链表中的位置)
*方法2:双指针 时间复杂度 O(n)
* @param head 带操作链表
* @return 是环形链表返回true;否则返回false
*/
public boolean hasCycle02(ListNode head) {
//空链表 直接返回false(非环形链表)
if (head == null || head.next == null) {
return false;
}
//定义快慢两个指针
ListNode slow = head;
ListNode fast = head.next;
//快慢指针值不一样一直循环 直到相等或者快指针走完链表(环形链表:链表尾连接到链表中的位置)
while (slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
//快指针是慢指针速度的2倍
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}