描述
Given a linked list, determine if it has a cycle in it.
To represent a cycle in the given linked list, we use an integer pos which represents the position (0-indexed) in the linked list where tail connects to. If pos is -1, then there is no cycle in the linked list
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环
例子
思路:O(n)
先保证链表不为空:head !=NULL(C++) if head:(python)
快慢指针:low=head,fast=head.next , fast每次走两步,low每次走一步,如果存在环,fast==low一定存在。如果走到了None【只检测走得快的即可】,则无环
while (向前走的结点不为空)
答案
- Java
public class Solution {
public boolean hasCycle(ListNode head) {
//处理无节点和一个节点
if(head==null || head.next==null) return false;
ListNode slow = head;
ListNode fast = head.next;
//有没有环?没有环,得到null
while(fast!=null && fast.next!=null){
if(fast==slow) return true;
else{
fast = fast.next.next;
slow = slow.next;
}
}
return false;
}
}
- python
def hasCycle(self, head: ListNode) -> bool:
if not head: return False
fast = head.next
while fast and fast.next:
if fast == head:
return True
fast = fast.next.next
head = head.next
return False
public class Solution {
public boolean hasCycle(ListNode head) {
if (head==null) return false;
//先进行一次:走一步,走两步 head head.next
ListNode fast=head.next;
//如果不是循环链表,肯定会跳出循环
while (fast!=null && fast.next!=null) {
if (fast==head) return true;
fast=fast.next.next;
//因为fast在前面已经趟过了,没有null
head=head.next;
}
return false;
}
}
- c++
bool hasCycle(ListNode *head) {
if (head==NULL) return false;
ListNode* fast = head->next;
while (fast!=NULL && fast->next !=NULL)
{
if (fast == head) return true;
fast = fast->next->next;
head = head->next;
}
return false;
}