题目描述
Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
- 思路
尽可能少的额外空间判断一个链表有无环。
①快慢两种指针,如果中间相遇则存在环
②把走过节点的下一个指向改变为head或者其他空间,如果再次访问到则为有环(无额外空间,链表被破坏)
③存储走过的节点,当再次走到该节点时表示有环
法一
/**
* 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)
return false;
ListNode list1 = head;
ListNode list2 = head;
while(list2 != null && list2.next != null){
list1 = list1.next;
list2 = list2.next.next;
if(list1 == list2)
return true;
}
return false;
}
}
法二
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null)
return false;
ListNode pre = head;
while(pre != null){
ListNode pos = pre.next;
if(pos == pre)
return true;
pre.next = head; //改变指向
pre = pos; //前移
}
return false;
}
}
法三
import java.util.HashSet;
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null)
return false;
HashSet<ListNode> set = new HashSet<ListNode>();
while(head != null){
if(set.contains(head) == true)
return true;
set.add(head);
head = head.next;
}
return false;
}
}