Linked List Cycle

2024. 11. 11. 13:52알고리즘/Leetcode

반응형

Solution

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.

 

 

Examples

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.

 

Explanation

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head == null) return false;
        ListNode walker = head, runner = head;
        while(runner.next != null && runner.next.next != null){
            walker = walker.next;
            runner = runner.next.next;
            if(walker == runner) return true;
        }
        return false;
        
    }
}

 

1. The problem with Cycles

In a linked list, if there is a cycle, some node will eventually point back to a previous node, causing an infinite loop. Without a mechanism to detect this, a standard traversal would never stop. Therefore, we use a two-pointer algorithm to check if it has a cycle in it.

 

2. Two-Pointer Approach

There are two ListNodes; one node, runner, moves twice as fast as the other, walker. If there is no cycle in it, the runner pointer will eventually reach the end of the list, the loop will terminate, and return false. If there is a cycle, the runner pointer will eventually "lap" the walker pointer. This is because the runner is moving faster, so it will finally catch up to the walker in the cycle. If this happens, the function returns true.

반응형

'알고리즘 > Leetcode' 카테고리의 다른 글

Palindrome Linked List  (1) 2024.11.11
Merge Two Sorted Lists  (2) 2024.11.08
Reverse Linked List  (1) 2024.11.07
Remove Nth Node From End of List  (4) 2024.11.06
Delete Node in a Linked List  (0) 2024.10.25