Bird
Raised Fist0
DSA Cprogramming~30 mins

Clone Linked List with Random Pointer in DSA C - Build from Scratch

Choose your learning style10 modes available
Clone Linked List with Random Pointer
📖 Scenario: Imagine you have a special linked list where each node has two pointers: one points to the next node, and another points randomly to any node in the list or NULL. This structure is used in complex applications like undo operations or social network connections.
🎯 Goal: You will build a program to create a copy (clone) of this linked list with random pointers. The cloned list should be completely separate but have the same values and random connections as the original.
📋 What You'll Learn
Define a Node struct with int val, Node* next, and Node* random.
Create an example linked list with 3 nodes and specific next and random pointers.
Write a function cloneList that clones the list with correct next and random pointers.
Print the original and cloned list showing each node's value and the value of the node pointed by random.
💡 Why This Matters
🌍 Real World
Cloning complex linked data structures is useful in undo-redo systems, copying social network graphs, and replicating game states.
💼 Career
Understanding how to clone linked structures with random pointers is important for software engineers working on advanced data structures, memory management, and system design.
Progress0 / 4 steps
1
Create the linked list nodes with next and random pointers
Define a struct called Node with int val, Node* next, and Node* random. Then create three nodes named node1, node2, and node3 with values 1, 2, and 3 respectively. Set node1.next = &node2, node2.next = &node3, and node3.next = NULL. Set node1.random = &node3, node2.random = &node1, and node3.random = &node2.
DSA C
Hint

Start by defining the Node struct with the three fields. Then create three variables of type Node and assign their values and pointers as instructed.

2
Create a helper function to clone the linked list
Write a function called cloneList that takes a pointer to Node called head and returns a pointer to the cloned list's head. For now, just declare the function prototype Node* cloneList(Node* head); above main.
DSA C
Hint

Write the function prototype above main so the compiler knows about it before use.

3
Implement the cloneList function to copy nodes with next and random pointers
Implement the cloneList function to clone the linked list with random pointers. Use the following approach:
1. For each node in the original list, create a new node with the same val and insert it right after the original node.
2. Set the random pointer of the new nodes to the new nodes corresponding to the original nodes' random pointers.
3. Separate the new nodes to form the cloned list and restore the original list.
Return the head of the cloned list.
DSA C
Hint

Follow the three-step approach: insert cloned nodes, assign random pointers, then separate the lists.

4
Print the original and cloned linked lists with random pointers
In main, call cloneList with &node1 and store the result in Node* clonedHead. Then write a function printList that takes Node* head and prints each node's val and the val of the node pointed by random (or NULL if random is NULL). Use printList to print both original and cloned lists.
DSA C
Hint

Write a printList function that prints each node's value and its random pointer's value or NULL. Then call it for both original and cloned lists.

Practice

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

Solution

  1. Step 1: Understand the linked list structure

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

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

    Maintaining the correct random pointer connections in the cloned list -> Option A
  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 of the following code snippets correctly creates a new node for cloning a linked list with random pointers in C?
easy
A. Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = oldNode->data; newNode->next = NULL; newNode->random = NULL;
B. Node newNode = malloc(sizeof(Node)); newNode.data = oldNode.data; newNode.next = NULL; newNode.random = NULL;
C. Node* newNode = malloc(Node); newNode->data = oldNode->data; newNode->next = NULL; newNode->random = NULL;
D. Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = oldNode->data; newNode->next = oldNode->next; newNode->random = oldNode->random;

Solution

  1. Step 1: Check correct malloc usage

    In C, malloc requires sizeof(Node) to allocate memory. Casting to (Node*) is good practice.
  2. Step 2: Verify initialization

    New node's data is copied, next and random pointers are set to NULL initially to avoid dangling pointers.
  3. Final Answer:

    Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = oldNode->data; newNode->next = NULL; newNode->random = NULL; -> Option A
  4. Quick Check:

    Correct malloc and initialization = Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = oldNode->data; newNode->next = NULL; newNode->random = NULL; [OK]
Hint: Use malloc with sizeof and initialize pointers to NULL [OK]
Common Mistakes:
  • Missing sizeof in malloc
  • Not casting malloc result
  • Copying next and random pointers directly
3. Given the following linked list with random pointers:
Node1(data=1) -> Node2(data=2) -> NULL
Node1.random = Node2
Node2.random = Node2

What will be the random pointer of the cloned Node1 after cloning?
medium
A. Points to NULL
B. Points to cloned Node2
C. Points to original Node2
D. Points to cloned Node1

Solution

  1. Step 1: Understand original random pointers

    Original Node1's random points to original Node2.
  2. Step 2: Cloning preserves structure

    Cloned Node1's random should point to cloned Node2, not original nodes, to maintain independence.
  3. Final Answer:

    Points to cloned Node2 -> Option B
  4. Quick Check:

    Random pointer in clone = cloned target node [OK]
Hint: Random pointers in clone point to cloned nodes [OK]
Common Mistakes:
  • Random pointer points to original node
  • Random pointer set to NULL by mistake
  • Confusing next and random pointers
4. Consider this buggy code snippet for cloning a linked list with random pointers:
while (curr != NULL) {
Node* copy = (Node*)malloc(sizeof(Node));
copy->data = curr->data;
copy->next = curr->next;
curr->next = copy;
curr = curr->next;
}

What is the main error causing an infinite loop?
medium
A. Copy node's next pointer is not set to NULL
B. Updating curr to curr->next skips the newly inserted node
C. Not updating curr to curr->next->next after insertion
D. malloc size is incorrect

Solution

  1. Step 1: Analyze pointer updates in loop

    After inserting copy node after curr, curr->next points to copy. Moving curr = curr->next moves to copy again.
  2. Step 2: Identify infinite loop cause

    Loop never advances past copy node because curr is updated to copy, not original next node. It should be curr = curr->next->next.
  3. Final Answer:

    Not updating curr to curr->next->next after insertion -> Option C
  4. Quick Check:

    Advance curr by two nodes after insertion [OK]
Hint: Move curr two steps after inserting copy [OK]
Common Mistakes:
  • Advancing curr by one node causes infinite loop
  • Forgetting to link copy nodes properly
  • Incorrect malloc size
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. Reverse the original list, clone it, then reverse back
B. Use a hash map to store original to copy node mapping, then assign pointers
C. Copy nodes one by one and assign random pointers by searching original list each time
D. Create copy nodes interleaved with original nodes, set random pointers using original nodes, then separate lists

Solution

  1. Step 1: Understand space and time constraints

    O(n) time and O(1) space means no extra data structures like hash maps.
  2. Step 2: Use interleaving method

    Insert cloned nodes between original nodes, assign random pointers using original nodes, then detach cloned list. This avoids extra space.
  3. Final Answer:

    Create copy nodes interleaved with original nodes, set random pointers using original nodes, then separate lists -> Option D
  4. Quick Check:

    Interleaving nodes = O(1) space cloning [OK]
Hint: Interleave cloned nodes to avoid extra space [OK]
Common Mistakes:
  • Using hash map increases space complexity
  • Searching original list for random pointers is O(n^2)
  • Reversing list does not help cloning random pointers
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