1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| package main
import "fmt"
type Node struct { Val int Next *Node Random *Node }
func createLinkedList(values [][2]int) *Node { if len(values) == 0 { return nil } nodes := make([]*Node, len(values)) for i, val := range values { nodes[i] = &Node{Val: val[0]} } for i := 0; i < len(values)-1; i++ { nodes[i].Next = nodes[i+1] } for i, val := range values { if val[1] != -1 { nodes[i].Random = nodes[val[1]] } } return nodes[0] }
func printLinkedList(head *Node) string { var result []string nodes := []*Node{} for node := head; node != nil; node = node.Next { nodes = append(nodes, node) }
for node := head; node != nil; node = node.Next { randomIndex := -1 if node.Random != nil { for i, n := range nodes { if n == node.Random { randomIndex = i break } } } result = append(result, fmt.Sprintf("[%d %d]", node.Val, randomIndex)) } return fmt.Sprintf("%v", result) }
func copyRandomList(head *Node) *Node { if head == nil { return nil }
for node := head; node != nil; node = node.Next.Next { newNode := &Node{Val: node.Val} newNode.Next = node.Next node.Next = newNode }
for node := head; node != nil; node = node.Next.Next { if node.Random != nil { node.Next.Random = node.Random.Next } }
newHead := head.Next for node := head; node != nil; node = node.Next { newNode := node.Next node.Next = node.Next.Next if newNode.Next != nil { newNode.Next = newNode.Next.Next } }
return newHead }
func main() { testCases := []struct { values [][2]int expected [][2]int }{ { values: [][2]int{{7,-1}, {13,0}, {11,4}, {10,2}, {1,0}}, expected: [][2]int{{7,-1}, {13,0}, {11,4}, {10,2}, {1,0}}, }, { values: [][2]int{{1,1}, {2,1}}, expected: [][2]int{{1,1}, {2,1}}, }, { values: [][2]int{{3,-1}, {3,0}, {3,-1}}, expected: [][2]int{{3,-1}, {3,0}, {3,-1}}, }, }
for i, tc := range testCases { head := createLinkedList(tc.values) fmt.Printf("Test Case %d, Input: head = %v\n", i+1, printLinkedList(head)) result := copyRandomList(head) resultStr := printLinkedList(result) expectedStr := fmt.Sprintf("%v", tc.expected) if resultStr == expectedStr { fmt.Printf("Test Case %d, Output: %v, PASS\n", i+1, resultStr) } else { fmt.Printf("Test Case %d, Output: %v, FAIL (Expected: %v)\n", i+1, resultStr, expectedStr) } } }
|