Bird
Raised Fist0
DSA Typescriptprogramming~5 mins

Detect if a Linked List is Circular in DSA Typescript - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does it mean for a linked list to be circular?
A linked list is circular if its last node points back to one of the previous nodes, creating a loop instead of ending with null.
Click to reveal answer
beginner
Which two pointers are commonly used to detect a cycle in a linked list?
The 'slow' pointer moves one step at a time, and the 'fast' pointer moves two steps at a time. If they meet, the list is circular.
Click to reveal answer
intermediate
Why does the fast pointer moving two steps help detect a cycle?
Because if there is a cycle, the fast pointer will eventually catch up to the slow pointer inside the loop, proving the list is circular.
Click to reveal answer
intermediate
What is the time complexity of detecting a cycle using the two-pointer method?
The time complexity is O(n), where n is the number of nodes, because each pointer moves through the list at most once.
Click to reveal answer
beginner
What should the fast pointer check to avoid errors during traversal?
The fast pointer should check if it or its next node is null to avoid accessing undefined nodes and causing errors.
Click to reveal answer
What indicates a circular linked list when using two pointers?
ASlow and fast pointers meet at the same node
BSlow pointer reaches null first
CFast pointer reaches null first
DSlow pointer moves faster than fast pointer
What is the initial position of slow and fast pointers in cycle detection?
ABoth start at the head node
BSlow starts at head, fast starts at second node
CSlow starts at second node, fast starts at head
DBoth start at null
What should you check before moving the fast pointer two steps ahead?
AIf slow.next is null
BIf slow is null
CIf fast or fast.next is null
DIf head is null
If a linked list has no cycle, what will happen to the fast pointer?
AIt will move backwards
BIt will meet slow pointer
CIt will loop infinitely
DIt will reach null
What is the main advantage of using two pointers for cycle detection?
AIt duplicates the list
BIt uses constant extra space
CIt reverses the list
DIt sorts the list
Explain how the two-pointer method detects a cycle in a linked list.
Think about how fast pointer can catch slow pointer only if there is a loop.
You got /4 concepts.
    Describe what makes a linked list circular and how it differs from a normal linked list.
    Focus on the last node's next pointer.
    You got /4 concepts.

      Practice

      (1/5)
      1. What does it mean if a linked list is circular?
      easy
      A. The last node points back to one of the previous nodes, forming a loop
      B. The linked list has no nodes
      C. The linked list nodes are sorted in ascending order
      D. The linked list has only one node

      Solution

      1. Step 1: Understand linked list structure

        A linked list is a chain of nodes where each node points to the next node.
      2. Step 2: Define circular linked list

        If the last node points back to any previous node, it creates a loop, making the list circular.
      3. Final Answer:

        The last node points back to one of the previous nodes, forming a loop -> Option A
      4. Quick Check:

        Circular linked list = last node points back [OK]
      Hint: Circular means last node links back to earlier node [OK]
      Common Mistakes:
      • Thinking circular means sorted
      • Confusing empty list with circular
      • Assuming single node list is always circular
      2. Which TypeScript code snippet correctly checks if a linked list is circular using two pointers?
      easy
      A. for(let node = head; node != null; node = node.next) { if(node.next === head) return true; } return false;
      B. let slow = head; while(slow) { slow = slow.next; if(slow === head) return true; } return false;
      C. let slow = head; let fast = head; while(fast && fast.next) { slow = slow.next; fast = fast.next.next; if(slow === fast) return true; } return false;
      D. let current = head; while(current.next) { current = current.next; } return current === null;

      Solution

      1. Step 1: Understand Floyd's cycle detection

        Use two pointers: slow moves 1 step, fast moves 2 steps. If they meet, list is circular.
      2. Step 2: Analyze code snippets

        let slow = head; let fast = head; while(fast && fast.next) { slow = slow.next; fast = fast.next.next; if(slow === fast) return true; } return false; correctly implements this logic with proper conditions and pointer moves.
      3. Final Answer:

        let slow = head; let fast = head; while(fast && fast.next) { slow = slow.next; fast = fast.next.next; if(slow === fast) return true; } return false; -> Option C
      4. Quick Check:

        Two pointers meet means circular [OK]
      Hint: Use slow and fast pointers to detect loop [OK]
      Common Mistakes:
      • Moving fast pointer only one step
      • Not checking fast and fast.next for null
      • Returning false too early
      3. What will be the output of this TypeScript code snippet?
      class Node { constructor(public val: number, public next: Node | null = null) {} }
      const head = new Node(1);
      head.next = new Node(2);
      head.next.next = new Node(3);
      head.next.next.next = head.next;
      function isCircular(head: Node | null): boolean {
      let slow = head;
      let fast = head;
      while (fast && fast.next) {
      slow = slow.next;
      fast = fast.next.next;
      if (slow === fast) return true;
      }
      return false;
      }
      console.log(isCircular(head));
      medium
      A. true
      B. false
      C. undefined
      D. Runtime error

      Solution

      1. Step 1: Understand the linked list structure

        Nodes 1 -> 2 -> 3, then 3 points back to node 2, creating a loop.
      2. Step 2: Trace the two-pointer loop detection

        Slow and fast pointers will meet inside the loop, so function returns true.
      3. Final Answer:

        true -> Option A
      4. Quick Check:

        Loop exists, so output is true [OK]
      Hint: Loop in list makes function return true [OK]
      Common Mistakes:
      • Assuming no loop because list looks linear
      • Confusing node references
      • Ignoring pointer equality check
      4. Identify the bug in this TypeScript function meant to detect a circular linked list:
      function isCircular(head: Node | null): boolean {
      let slow = head;
      let fast = head;
      while (fast !== null) {
      slow = slow.next;
      fast = fast.next.next;
      if (slow === fast) return true;
      }
      return false;
      }
      medium
      A. The function should use a for loop instead of while
      B. The slow pointer should move two steps instead of one
      C. The function should return false inside the loop
      D. The while loop should check fast and fast.next for null before moving pointers

      Solution

      1. Step 1: Analyze pointer movement safety

        fast.next.next is accessed without checking if fast.next is null, risking runtime error.
      2. Step 2: Correct loop condition

        Loop should check both fast and fast.next are not null before moving pointers to avoid errors.
      3. Final Answer:

        The while loop should check fast and fast.next for null before moving pointers -> Option D
      4. Quick Check:

        Check fast and fast.next to avoid errors [OK]
      Hint: Always check fast and fast.next before advancing fast [OK]
      Common Mistakes:
      • Not checking fast.next before fast.next.next
      • Moving slow pointer incorrectly
      • Returning false too early
      5. Given a singly linked list where the last node might point to any node in the list or null, how would you modify the detection function to also return the node where the cycle begins if it is circular?
      Which approach correctly finds the start of the loop?
      hard
      A. Count the number of nodes and return the middle node as the start of the loop
      B. After detecting the cycle, reset one pointer to head and move both pointers one step at a time until they meet; the meeting point is the start of the loop
      C. Use a hash set to store visited nodes and return the first repeated node found
      D. Reverse the linked list and check if the head changes to detect the loop start

      Solution

      1. Step 1: Detect cycle using two pointers

        Use Floyd's algorithm to find if slow and fast pointers meet inside the loop.
      2. Step 2: Find loop start node

        Reset one pointer to head, move both pointers one step at a time; their meeting point is the loop start.
      3. Final Answer:

        After detecting the cycle, reset one pointer to head and move both pointers one step at a time until they meet; the meeting point is the start of the loop -> Option B
      4. Quick Check:

        Reset pointer and move both to find loop start [OK]
      Hint: Reset pointer after cycle detection to find loop start [OK]
      Common Mistakes:
      • Assuming middle node is loop start
      • Using node count instead of pointers
      • Trying to reverse list to find loop
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard