mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-04 08:02:30 +08:00
45 lines
723 B
Go
45 lines
723 B
Go
package leetcode
|
|
|
|
// Node define
|
|
type Node struct {
|
|
Val int
|
|
Next *Node
|
|
Random *Node
|
|
}
|
|
|
|
func copyRandomList(head *Node) *Node {
|
|
if head == nil {
|
|
return nil
|
|
}
|
|
tempHead := copyNodeToLinkedList(head)
|
|
return splitLinkedList(tempHead)
|
|
}
|
|
|
|
func splitLinkedList(head *Node) *Node {
|
|
cur := head
|
|
head = head.Next
|
|
for cur != nil && cur.Next != nil {
|
|
cur.Next, cur = cur.Next.Next, cur.Next
|
|
}
|
|
return head
|
|
}
|
|
|
|
func copyNodeToLinkedList(head *Node) *Node {
|
|
cur := head
|
|
for cur != nil {
|
|
node := &Node{
|
|
Val: cur.Val,
|
|
Next: cur.Next,
|
|
}
|
|
cur.Next, cur = node, cur.Next
|
|
}
|
|
cur = head
|
|
for cur != nil {
|
|
if cur.Random != nil {
|
|
cur.Next.Random = cur.Random.Next
|
|
}
|
|
cur = cur.Next.Next
|
|
}
|
|
return head
|
|
}
|