问题
判断列表是否有环:
方案1:空间换时间
使用Map存储已遍历的节点,每次判断是否已遍历,如果遍历则有环。
方案2:时间换空间
秒针 一定 会追上 时针。
秒针就是兔子,快指针。时针就是乌龟,慢指针。也就快慢指针。
假想「乌龟」和「兔子」在链表上移动,「兔子」跑得快,「乌龟」跑得慢。当「乌龟」和「兔子」从链表上的同一个节点开始移动时,如果该链表中没有环,那么「兔子」将一直处于「乌龟」的前方;如果该链表中有环,那么「兔子」会先于「乌龟」进入环,并且一直在环内移动。等到「乌龟」进入环时,由于「兔子」的速度快,它一定会在某个时刻与乌龟相遇,即套了「乌龟」若干圈。
代码
代码验证:力扣
/**
* 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) {
if(head == null || head.next == null || head.next.next == null){
return false;
}
ListNode fast = head;
ListNode slow = head;
while(fast != null && slow != null ){
slow = slow.next;
fast = fast.next;
if(fast != null){
fast = fast.next;
}
if(fast == slow){
return true;
}
}
return false;
}
}
学习快慢指针来判断换的思想。