Bird
Raised Fist0
DSA Typescriptprogramming~5 mins

Clone Linked List with Random Pointer in DSA Typescript - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a 'random pointer' in a linked list?
A random pointer is a special pointer in each node of a linked list that can point to any node in the list or be null, not necessarily the next node.
Click to reveal answer
intermediate
Why do we need to clone a linked list with random pointers carefully?
Because each node has two pointers (next and random), we must copy both correctly to avoid sharing nodes between original and cloned lists.
Click to reveal answer
intermediate
What is the first step in the common approach to clone a linked list with random pointers?
Insert a cloned node right after each original node in the list, so the list looks like: original1 -> clone1 -> original2 -> clone2 -> ...
Click to reveal answer
intermediate
How do we set the random pointers of the cloned nodes?
For each original node, set the cloned node's random pointer to original.random.next if original.random is not null.
Click to reveal answer
intermediate
What is the final step after setting next and random pointers in the cloned list?
Separate the cloned nodes from the original nodes to form the cloned linked list and restore the original list.
Click to reveal answer
What does the random pointer in a linked list node point to?
AThe head node always
BOnly the next node
COnly the previous node
DAny node in the list or null
In the cloning process, where is the cloned node inserted initially?
ABefore the original node
BAt the end of the list
CAfter the original node
DRandomly in the list
How do you assign the random pointer of a cloned node?
Aoriginal.random.next
Boriginal.next.random
Coriginal.random
Doriginal.next.next
What is the purpose of separating the cloned list from the original list at the end?
ATo restore the original list and get the cloned list separately
BTo delete the original list
CTo merge both lists
DTo reverse the list
What is the time complexity of cloning a linked list with random pointers using the common approach?
AO(log n)
BO(n)
CO(n^2)
DO(1)
Explain the three main steps to clone a linked list with random pointers.
Think about how to keep track of original and cloned nodes together.
You got /3 concepts.
    Why can't we simply copy nodes one by one and assign random pointers later without interleaving cloned nodes?
    Consider how to find the clone of a node pointed by random.
    You got /3 concepts.

      Practice

      (1/5)
      1. What is the main challenge when cloning a linked list with a random pointer?
      easy
      A. Reversing the linked list before cloning
      B. Copying the data values of each node
      C. Maintaining the correct random pointer connections in the cloned list
      D. Sorting the linked list nodes

      Solution

      1. Step 1: Understand the structure of the linked list

        The linked list has two pointers: next and random. The random pointer can point to any node or null.
      2. Step 2: Identify the cloning challenge

        While copying nodes is straightforward, correctly assigning random pointers in the cloned list is tricky because they may point to nodes not yet cloned.
      3. Final Answer:

        Maintaining the correct random pointer connections in the cloned list -> Option C
      4. Quick Check:

        Random pointer cloning = main challenge [OK]
      Hint: Focus on copying random pointers correctly [OK]
      Common Mistakes:
      • Ignoring random pointers during cloning
      • Assuming random pointers are always null
      • Copying only next pointers
      2. Which TypeScript syntax correctly declares a node with a random pointer in a linked list?
      easy
      A. class Node { val: number; next: Node | null; random: Node | null; constructor(val?: number) { this.val = val ?? 0; this.next = null; this.random = null; } }
      B. class Node { val: number; next: Node; random: Node; constructor(val: number) { this.val = val; this.next = null; this.random = null; } }
      C. interface Node { val: number; next: Node; random: Node; }
      D. type Node = { val: number; next?: Node; random?: Node; };

      Solution

      1. Step 1: Check for nullable pointers

        Both next and random pointers can be null, so their types must allow null.
      2. Step 2: Verify constructor and property declarations

        class Node { val: number; next: Node | null; random: Node | null; constructor(val?: number) { this.val = val ?? 0; this.next = null; this.random = null; } } correctly uses 'Node | null' and initializes properties properly with optional val.
      3. Final Answer:

        Option A correctly declares nullable next and random pointers with proper constructor -> Option A
      4. Quick Check:

        Nullable pointers + constructor = class Node { val: number; next: Node | null; random: Node | null; constructor(val?: number) { this.val = val ?? 0; this.next = null; this.random = null; } } [OK]
      Hint: Use 'Node | null' for nullable pointers in TypeScript [OK]
      Common Mistakes:
      • Not allowing null for next or random
      • Using interface without constructor
      • Missing property initializations
      3. What is the output of the following TypeScript code snippet that clones a linked list with random pointers?
      class Node {
        val: number;
        next: Node | null;
        random: Node | null;
        constructor(val?: number) {
          this.val = val ?? 0;
          this.next = null;
          this.random = null;
        }
      }
      
      function cloneList(head: Node | null): Node | null {
        if (!head) return null;
        let curr = head;
        while (curr) {
          const copy = new Node(curr.val);
          copy.next = curr.next;
          curr.next = copy;
          curr = copy.next;
        }
        curr = head;
        while (curr) {
          if (curr.random) curr.next!.random = curr.random.next;
          curr = curr.next!.next;
        }
        curr = head;
        const pseudoHead = new Node(0);
        let copyCurr = pseudoHead;
        while (curr) {
          copyCurr.next = curr.next;
          curr.next = curr.next!.next;
          copyCurr = copyCurr.next;
          curr = curr.next;
        }
        return pseudoHead.next;
      }
      
      // Original list: 1 -> 2 -> null
      // Node 1 random points to Node 2
      // Node 2 random points to Node 1
      
      const node1 = new Node(1);
      const node2 = new Node(2);
      node1.next = node2;
      node1.random = node2;
      node2.random = node1;
      
      const clonedHead = cloneList(node1);
      
      console.log(clonedHead!.val);
      console.log(clonedHead!.random!.val);
      console.log(clonedHead!.next!.val);
      console.log(clonedHead!.next!.random!.val);
      medium
      A. 1 2 2 1
      B. 1 1 2 2
      C. 2 1 1 2
      D. 1 2 1 2

      Solution

      1. Step 1: Understand cloning steps

        The code interleaves cloned nodes, assigns random pointers, then separates the cloned list.
      2. Step 2: Trace output values

        clonedHead.val = 1; clonedHead.random.val = 2; clonedHead.next.val = 2; clonedHead.next.random.val = 1.
      3. Final Answer:

        1 2 2 1 -> Option A
      4. Quick Check:

        Cloned values and randoms match original pattern [OK]
      Hint: Interleave nodes, assign randoms, then separate [OK]
      Common Mistakes:
      • Not updating random pointers correctly
      • Mixing original and cloned nodes in output
      • Confusing next and random values
      4. Identify the bug in this TypeScript function that attempts to clone a linked list with random pointers:
      function cloneList(head: Node | null): Node | null {
        if (!head) return null;
        let curr = head;
        while (curr) {
          const copy = new Node(curr.val);
          copy.next = curr.next;
          curr.next = copy;
          curr = curr.next;
        }
        curr = head;
        while (curr) {
          if (curr.random) curr.next!.random = curr.random.next;
          curr = curr.next!.next;
        }
        curr = head;
        const pseudoHead = new Node(0);
        let copyCurr = pseudoHead;
        while (curr) {
          copyCurr.next = curr.next;
          curr.next = curr.next!.next;
          copyCurr = copyCurr.next;
          curr = curr.next;
        }
        return pseudoHead.next;
      }
      medium
      A. Random pointers are not assigned at all
      B. In the first while loop, curr is updated incorrectly causing an infinite loop
      C. The cloned list is not separated from the original list
      D. The function does not handle empty lists

      Solution

      1. Step 1: Analyze the first while loop

        Inside the loop, curr is updated as curr = curr.next, but curr.next is the cloned node, so curr never moves past cloned nodes, causing infinite loop.
      2. Step 2: Correct the pointer update

        It should be curr = copy.next to move to the next original node.
      3. Final Answer:

        In the first while loop, curr is updated incorrectly causing an infinite loop -> Option B
      4. Quick Check:

        Incorrect curr update = infinite loop [OK]
      Hint: Update curr to next original node, not cloned node [OK]
      Common Mistakes:
      • Updating curr to curr.next instead of curr.next.next
      • Skipping random pointer assignment
      • Not separating cloned list
      5. Given a linked list with random pointers, how would you modify the cloning algorithm to handle the case where some random pointers point to null and others form cycles? Choose the best approach.
      hard
      A. Ignore random pointers that are null and only clone non-null random pointers
      B. Reverse the linked list before cloning to handle cycles
      C. Clone nodes and assign random pointers in a single pass without extra space
      D. Use a hash map to store original to cloned node mappings and assign random pointers after cloning all nodes

      Solution

      1. Step 1: Understand random pointer complexities

        Random pointers can be null or form cycles, so direct assignment during cloning is unsafe.
      2. Step 2: Use a hash map for safe cloning

        Mapping original nodes to cloned nodes allows assigning random pointers correctly after all nodes are cloned, handling nulls and cycles safely.
      3. Final Answer:

        Use a hash map to store original to cloned node mappings and assign random pointers after cloning all nodes -> Option D
      4. Quick Check:

        Hash map handles nulls and cycles safely [OK]
      Hint: Use hash map to track clones before assigning randoms [OK]
      Common Mistakes:
      • Ignoring null random pointers
      • Trying to assign randoms in one pass without map
      • Reversing list unnecessarily
      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