Given a linked list, determine if it has a cycle in it.
Follow up:
Can you solve it without using extra space?
第一种解法
使用快慢指针,如果有环则快慢指针终会相遇,然而要是出现哪一个指针的下一个为null时则代表该链表没有环
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null)
return false;
ListNode slow = head;
ListNode fast = head;
while (true){
if(slow.next !=null)
slow = slow.next;
else
return false;
if(fast.next!=null){
fast = fast.next;
if(fast.next!=null){
fast = fast.next;
}else
return false;
}else
return false;
if(slow == fast)
return true;
}
}
}
第二种解法
投机取巧了,看到follow up 里说能不能使用额外的内存空间,我不会,就暴力了测试数据比较水,循环上限设置成10000次就过了
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null)
return false;
for(int i=0;i<10000;i++){
if(head.next!=null)
head = head.next;
else
return false;
}
return true;
}
}
第三种解法:
这里就不贴出来了,是用一个集合保存遍历出来的节点,如果集合中已经包含了下一个要遍历的节点那么代表当前链表为环形链表,如果遍历出的下一个节点为 null 则代表该链表不是环形链表