📖 Scenario: You are working on a system that manages a special linked list. Each node has two pointers: one points to the next node, and another points to any random node in the list or null. You need to create a copy of this list exactly, including the random pointers.
🎯 Goal: Build a program that clones a linked list with random pointers. The clone should be a new list with the same values and the same random pointer structure.
📋 What You'll Learn
Create a Node class with int val, Node next, and Node random fields.
Create the original linked list with 3 nodes having values 1, 2, and 3.
Set the random pointers as: node1.random = node3, node2.random = node1, node3.random = node2.
Implement a method CloneList that returns a deep copy of the list.
Print the cloned list nodes showing their val and the val of their random pointer or null.
💡 Why This Matters
🌍 Real World
Cloning complex linked data structures is useful in applications like undo-redo systems, copy-on-write memory management, and replicating graph-like data.
💼 Career
Understanding how to clone linked lists with random pointers is a common interview question and demonstrates mastery of pointers, references, and deep copy concepts.
Progress0 / 4 steps
1
Create the Node class and original linked list
Create a class called Node with public fields int val, Node next, and Node random. Then create three nodes named node1, node2, and node3 with values 1, 2, and 3 respectively. Link them using the next pointer so that node1.next = node2 and node2.next = node3. Set node3.next = null.
DSA C#
Hint
Define the Node class with the three fields. Then create three nodes and link them using the next pointers.
2
Set the random pointers for the original list
Set the random pointers of the nodes as follows: node1.random = node3, node2.random = node1, and node3.random = node2.
DSA C#
Hint
Assign the random pointers exactly as described to link nodes randomly.
3
Implement the CloneList method to copy the list
Implement a method called CloneList that takes a Node head parameter and returns a new Node which is the head of the cloned list. Use the approach of inserting cloned nodes after original nodes, then fixing the random pointers, and finally separating the cloned list from the original.
DSA C#
Hint
Follow the three-step approach: insert cloned nodes, assign random pointers, then separate the lists.
4
Print the cloned list showing values and random pointers
Call CloneList with node1 as input and store the result in clonedHead. Then use a while loop to print each node's val and the val of its random pointer or null if random is null. Print each node on a new line in the format: "Node val: X, Random val: Y".
DSA C#
Hint
Call CloneList with node1, then loop through the cloned list printing each node's value and its random pointer's value or null.
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. Sorting the linked list before cloning
C. Copying the next pointers correctly while preserving the random pointers
D. Ignoring the random pointers during cloning
Solution
Step 1: Understand the structure of the linked list
The linked list has two pointers: next and random. The next pointer points to the next node, and the random pointer can point to any node or null.
Step 2: Identify the cloning challenge
While cloning, copying next pointers is straightforward, but random pointers can point anywhere, so they must be copied carefully to preserve the original structure.
Final Answer:
Copying the next pointers correctly while preserving the random pointers -> Option C
Quick Check:
Random pointer preservation = main cloning challenge [OK]
Hint: Remember random pointers can point anywhere, handle them carefully [OK]
Common Mistakes:
Ignoring random pointers during cloning
Assuming random pointers follow next pointers
Trying to sort or reverse the list before cloning
2. Which of the following C# code snippets correctly declares a node class for a linked list with a random pointer?
easy
A. public class Node { public int val; public Node next; public Node random; public Node(int val) { this.val = val; next = null; random = null; } }
B. public class Node { int val; Node next; Node random; }
C. class Node { public int val; public Node next; }
D. public struct Node { public int val; public Node next; public Node random; }
Solution
Step 1: Check for correct access modifiers and constructor
public class Node { public int val; public Node next; public Node random; public Node(int val) { this.val = val; next = null; random = null; } } declares a public class with public fields and a constructor initializing val, next, and random to null, which is correct.
Step 2: Identify issues in other options
public class Node { int val; Node next; Node random; } lacks access modifiers and constructor. class Node { public int val; public Node next; } misses random pointer. public struct Node { public int val; public Node next; public Node random; } uses struct which is not ideal for linked list nodes.
Final Answer:
Option A code snippet correctly declares the node class -> Option A
Quick Check:
Public class with constructor = correct node declaration [OK]
Hint: Use public class with constructor initializing all pointers [OK]
Common Mistakes:
Missing public access modifiers
Not initializing pointers in constructor
Using struct instead of class for nodes
3. Given the following code snippet for cloning a linked list with random pointers, what will be the output of the cloned list's node values in order?
Node head = new Node(1);
head.next = new Node(2);
head.next.next = new Node(3);
head.random = head.next.next; // 1's random points to 3
head.next.random = head; // 2's random points to 1
head.next.next.random = head.next; // 3's random points to 2
Node clonedHead = CloneLinkedList(head);
Node current = clonedHead;
while (current != null) {
Console.Write(current.val + " ");
current = current.next;
}
medium
A. 3 2 1
B. 1 2 3
C. 1 3 2
D. 2 1 3
Solution
Step 1: Understand the original list structure
The original list nodes are 1 -> 2 -> 3 with next pointers in that order. Random pointers do not affect the order of next pointers.
Step 2: Cloning preserves next order
The CloneLinkedList function clones nodes preserving the next pointer order, so the cloned list will have nodes 1 -> 2 -> 3 in sequence.
Final Answer:
1 2 3 -> Option B
Quick Check:
Next pointers order = 1 2 3 [OK]
Hint: Cloning preserves next order; random pointers don't change sequence [OK]
Common Mistakes:
Confusing random pointer order with next pointer order
Assuming cloned list reverses nodes
Printing random pointer values instead of node values
4. Identify the bug in the following CloneLinkedList method that clones a linked list with random pointers:
public Node CloneLinkedList(Node head) {
if (head == null) return null;
Node current = head;
while (current != null) {
Node copy = new Node(current.val);
copy.next = current.next;
current.next = copy;
current = current.next;
}
// Setting random pointers omitted for brevity
return head.next;
}
medium
A. The method returns the original list head instead of cloned head
B. Random pointers are not set, so cloned list is incomplete
C. The copy node's next pointer is set incorrectly
D. The current pointer update causes an infinite loop
Solution
Step 1: Analyze the while loop pointer update
Inside the loop, current is updated with current = current.next, but after insertion, current.next points to the copy node, so current moves to copy node again, causing an infinite loop.
Step 2: Correct pointer update to skip copy node
To avoid infinite loop, current should be updated to current.next.next to move to the next original node.
Final Answer:
The current pointer update causes an infinite loop -> Option D
Quick Check:
Pointer update must skip copy node to avoid infinite loop [OK]
Hint: Update current to current.next.next after inserting copy [OK]
Common Mistakes:
Updating current to current.next causes infinite loop
Forgetting to set random pointers
Returning original head instead of cloned head
5. You want to clone a linked list with random pointers in O(n) time and O(1) extra space. Which approach correctly achieves this?
hard
A. Interleave cloned nodes with original nodes, set random pointers, then separate lists
B. Reverse the original list, clone nodes, then reverse back
C. Create a new list by copying values only, ignoring random pointers
D. Use a hash map to store original to cloned node mappings
Solution
Step 1: Understand space and time constraints
O(n) time and O(1) extra space means no extra data structures like hash maps can be used.
Step 2: Use interleaving method
Interleave cloned nodes between original nodes, set random pointers using original nodes, then separate the two lists. This uses no extra space and runs in linear time.
Final Answer:
Interleave cloned nodes with original nodes, set random pointers, then separate lists -> Option A
Quick Check:
Interleaving nodes = O(n) time & O(1) space cloning [OK]
Hint: Interleave clones between originals to avoid extra space [OK]
Common Mistakes:
Using hash map increases space to O(n)
Ignoring random pointers during cloning
Reversing list does not help cloning random pointers
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.