3. Given the following Go code snippet for cloning a linked list with random pointers, what will be the output of printing the cloned list values in order?
type Node struct {
Val int
Next *Node
Random *Node
}
func cloneList(head *Node) *Node {
if head == nil {
return nil
}
// Step 1: Insert cloned nodes
curr := head
for curr != nil {
newNode := &Node{Val: curr.Val}
newNode.Next = curr.Next
curr.Next = newNode
curr = newNode.Next
}
// Step 2: Copy random pointers
curr = head
for curr != nil {
if curr.Random != nil {
curr.Next.Random = curr.Random.Next
}
curr = curr.Next.Next
}
// Step 3: Separate cloned list
curr = head
cloneHead := head.Next
cloneCurr := cloneHead
for curr != nil {
curr.Next = curr.Next.Next
if cloneCurr.Next != nil {
cloneCurr.Next = cloneCurr.Next.Next
}
curr = curr.Next
cloneCurr = cloneCurr.Next
}
return cloneHead
}
// Original list: 1 -> 2 -> 3 -> nil
// Random pointers: 1.random = 3, 2.random = 1, 3.random = 2
func main() {
n3 := &Node{Val: 3}
n2 := &Node{Val: 2, Next: n3}
n1 := &Node{Val: 1, Next: n2}
n1.Random = n3
n2.Random = n1
n3.Random = n2
cloned := cloneList(n1)
curr := cloned
for curr != nil {
fmt.Print(curr.Val)
if curr.Next != nil {
fmt.Print(" -> ")
}
curr = curr.Next
}
fmt.Println(" -> nil")
}