Bird
Raised Fist0
DSA C++programming~5 mins

Detect if a Linked List is Circular in DSA C++ - 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 instead of pointing to null, creating a loop.
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 and slow pointer method work for detecting cycles?
Because the fast pointer moves faster, if there is a cycle, it will eventually catch up to the slow pointer inside the loop.
Click to reveal answer
beginner
What is the time complexity of detecting a cycle using the fast and slow pointer method?
The time complexity is O(n), where n is the number of nodes in the linked list.
Click to reveal answer
intermediate
Show the basic C++ code snippet to detect if a linked list is circular using fast and slow pointers.
Node* slow = head; Node* fast = head; while (fast && fast->next) { slow = slow->next; fast = fast->next->next; if (slow == fast) return true; } return false;
Click to reveal answer
What does the fast pointer do in cycle detection?
AMoves one step at a time
BMoves two steps at a time
CMoves three steps at a time
DDoes not move
If a linked list has no cycle, what will the fast pointer eventually point to?
ANull
BA node inside the list
CThe head node
DIt will loop forever
What is the main advantage of using the fast and slow pointer method?
AUses extra memory
BOnly works for circular lists
CDetects cycle in O(n^2) time
DDetects cycle in O(n) time without extra space
What happens if the slow and fast pointers meet during traversal?
AThe list is circular
BThe list is not circular
CThe list is empty
DThe pointers reset
Which of these is NOT a sign of a circular linked list?
AFast pointer meets slow pointer
BLast node points to head
CLast node points to null
DTraversal never ends
Explain how the fast and slow pointer method detects a cycle in a linked list.
Think about two runners on a track, one faster than the other.
You got /4 concepts.
    Describe the difference between a circular linked list and a linear linked list.
    Consider what happens when you keep following the next pointers.
    You got /4 concepts.

      Practice

      (1/5)
      1. What does it mean if a linked list is circular?
      easy
      A. The linked list nodes are sorted in ascending order
      B. The linked list has no nodes
      C. The last node points back to one of the previous nodes, forming a loop
      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 C
      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 list
      • Confusing empty list with circular list
      • Assuming single node list is always circular
      2. Which of the following C++ code snippets correctly checks if a linked list is circular using a slow and fast pointer approach?
      easy
      A. while(slow != nullptr) { slow = slow->next; if(slow == fast) return true; } return false;
      B. while(fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; if(slow == fast) return true; } return false;
      C. for(int i=0; i<10; i++) { if(slow == fast) return true; slow = slow->next; fast = fast->next; } return false;
      D. if(head == nullptr) return true; else return false;

      Solution

      1. Step 1: Understand slow and fast pointer method

        Two pointers move at different speeds; if they meet, a loop exists.
      2. Step 2: Analyze code correctness

        while(fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; if(slow == fast) return true; } return false; correctly moves slow by one and fast by two nodes, checking for equality inside the loop.
      3. Final Answer:

        while(fast != nullptr && fast->next != nullptr) { slow = slow->next; fast = fast->next->next; if(slow == fast) return true; } return false; -> Option B
      4. Quick Check:

        Slow-fast pointer meeting means circular [OK]
      Hint: Fast pointer moves twice as fast; meeting means loop [OK]
      Common Mistakes:
      • Not checking fast and fast->next for nullptr
      • Moving pointers at same speed
      • Returning true without pointer meeting
      3. What will be the output of the following C++ code snippet?
      struct Node {
        int data;
        Node* next;
      };
      
      Node* head = new Node{1, nullptr};
      Node* second = new Node{2, nullptr};
      Node* third = new Node{3, nullptr};
      head->next = second;
      second->next = third;
      third->next = second; // creates a loop
      
      bool isCircular(Node* head) {
        Node* slow = head;
        Node* fast = head;
        while(fast != nullptr && fast->next != nullptr) {
          slow = slow->next;
          fast = fast->next->next;
          if(slow == fast) return true;
        }
        return false;
      }
      
      std::cout << (isCircular(head) ? "Circular" : "Not Circular") << std::endl;
      medium
      A. Circular
      B. Not Circular
      C. Compilation Error
      D. Runtime Error

      Solution

      1. Step 1: Analyze linked list structure

        third->next points to second, creating a loop between second and third nodes.
      2. Step 2: Trace slow and fast pointers

        Slow moves one step, fast moves two steps; they will meet inside the loop, returning true.
      3. Final Answer:

        Circular -> Option A
      4. Quick Check:

        Loop detected by slow-fast pointers = Circular [OK]
      Hint: Loop causes slow and fast pointers to meet [OK]
      Common Mistakes:
      • Ignoring the loop created by third->next
      • Assuming no loop means Not Circular
      • Confusing pointer assignments
      4. Identify the error in the following code that attempts to detect if a linked list is circular:
      bool isCircular(Node* head) {
        Node* slow = head;
        Node* fast = head;
        while(fast != nullptr) {
          slow = slow->next;
          fast = fast->next->next;
          if(slow == fast) return true;
        }
        return false;
      }
      medium
      A. The loop condition should check fast->next != nullptr to avoid null pointer dereference
      B. The slow pointer should move two steps instead of one
      C. The function should return false inside the loop
      D. The function should initialize slow and fast to nullptr

      Solution

      1. Step 1: Check loop condition safety

        fast->next->next is accessed, so fast->next must not be nullptr to avoid crash.
      2. Step 2: Correct loop condition

        Change while(fast != nullptr) to while(fast != nullptr && fast->next != nullptr) to prevent null pointer dereference.
      3. Final Answer:

        The loop condition should check fast->next != nullptr to avoid null pointer dereference -> Option A
      4. Quick Check:

        Check fast and fast->next to avoid crash [OK]
      Hint: Always check fast->next before fast->next->next [OK]
      Common Mistakes:
      • Not checking fast->next leads to runtime error
      • Moving slow pointer incorrectly
      • Returning false too early
      5. You have a singly linked list where the last node might point back to any node, making it circular. How would you modify the list to remove the circular link and make it linear again?
      hard
      A. Set head to nullptr to clear the list
      B. Delete all nodes after the head node
      C. Reverse the linked list to break the loop
      D. Detect the loop using slow and fast pointers, then find the node before the loop start and set its next to nullptr

      Solution

      1. Step 1: Detect loop using slow and fast pointers

        Use two pointers moving at different speeds; if they meet, a loop exists.
      2. Step 2: Find the node before loop start and break the loop

        Reset one pointer to head, move both one step until they meet; the node before meeting point is loop end. Set its next to nullptr.
      3. Final Answer:

        Detect the loop using slow and fast pointers, then find the node before the loop start and set its next to nullptr -> Option D
      4. Quick Check:

        Find loop start, break link to remove circular [OK]
      Hint: Find loop start, set previous node's next to nullptr [OK]
      Common Mistakes:
      • Deleting nodes unnecessarily
      • Reversing list does not remove loop
      • Setting head to nullptr loses entire list
      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