Linked List Cycle
Given head
, the head of a linked list, determine if the linked list has a cycle in it.
There is a cycle in a linked list if there is some node in the list that can be reached again by continuously following the next
pointer. Internally, pos
is used to denote the index of the node that tail's next
pointer is connected to. Note that pos
is not passed as a parameter.
Return true
if there is a cycle in the linked list. Otherwise, return false
.
Example 1:
Input: head = [3,2,0,-4], pos = 1
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 1st node (0-indexed).
Example 2:
Input: head = [1,2], pos = 0
Output: true
Explanation: There is a cycle in the linked list, where the tail connects to the 0th node.
Example 3:
Input: head = [1], pos = -1
Output: false
Explanation: There is no cycle in the linked list.
Constraints:
The number of the nodes in the list is in the range
[0, 104]
.-105 <= Node.val <= 105
pos
is-1
or a valid index in the linked-list.
Solutions
This is a method for detecting a cycle in a singly-linked list using the Floyd’s cycle-finding algorithm, also known as the tortoise and the hare algorithm.
Steps
Check for empty or single node list: If the list is empty or only contains a single node, it cannot contain a cycle, so return
false
.Initialize two pointers
slow
andfast
: Theslow
pointer moves one step at a time, while thefast
pointer moves two steps at a time.Detect cycle: Traverse the list with the
slow
andfast
pointers. If a cycle exists, thefast
pointer will eventually catch up to theslow
pointer (i.e., they will point to the same node). If thefast
pointer reaches the end of the list, then no cycle exists.Return result: If the
slow
andfast
pointers meet, then a cycle exists, so returntrue
. Otherwise, returnfalse
.
/**
* Definition for singly-linked list.
* public class ListNode {
* public int val;
* public ListNode next;
* public ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public bool HasCycle(ListNode head) {
if (head == null || head.next == null)
{
return false;
}
var slow = head;
var fast = head.next;
while (slow != fast)
{
if (fast == null || fast.next == null)
{
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return slow == fast;
}
}
Complexity
Time Complexity: O(N)
Space Complexity: O(1)
Last updated