思路
-
链表的复制,因为涉及到next指针和random指针
-
创建Map<Node,Node>来存储Node,用两次循环完成复制
- 第一次循环:参数Node作为key,创建一个val相同的Node作为value
- 第二次循环:为map中所有的value创建next指针和random指针
-
返回map中key为head的value
java
public Node copyRandomList(Node head) {
Map<Node, Node> map = new HashMap<>();
Node temp = head;
while (Objects.nonNull(temp)) {
map.put(temp, new Node(temp.val));
temp = temp.next;
}
temp = head;
while (Objects.nonNull(temp)) {
map.get(temp).next = map.get(temp.next);
map.get(temp).random = map.get(temp.random);
temp = temp.next;
}
return map.get(head);
}
go
func copyRandomList(head *Node) *Node {
temp := head
m := make(map[*Node]*Node)
for temp != nil {
m[temp] = &Node{Val: temp.Val}
temp = temp.Next
}
temp = head
for temp != nil {
m[temp].Next = m[temp.Next]
m[temp].Random = m[temp.Random]
temp = temp.Next
}
return m[head]
}