题目描述
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
看完官方解法(个人想法)
官方解法是用递归调用去不断的创建next节点和random节点,我看完以后就开始自己写,但是写完以后没有用到hashmap结构,也忘记了官方为啥要用到hashmap,然后调用以后爆栈了
if (head == null) {
return null;
}
Node newNode = new Node(head.val);
newNode.next = copyRandomList(head.next);
newNode.random = copyRandomList(head.random);
return newNode;
当时自己心里的想法是:递归调用先把next创建完毕,然后再从头开始递归调用创建random,这是错误的,当next递归调用到最后一个以后,它会再使用random去递归(执行到下一行,而不是从head头结点的地方重新递归),然后random可能会随机到另一个已经创建过的节点,这样递归就结束不了了,所以就爆栈了。
正确的解法
Map<Node, Node> cachedNode = new HashMap<>();
public Node copyRandomList(Node head) {
if (head == null) {
return null;
}
if (!cachedNode.containsKey(head)) {
Node newNode = new Node(head.val);
cachedNode.put(head, newNode);
newNode.next = copyRandomList(head.next);
newNode.random = copyRandomList(head.random);
}
return cachedNode.get(head);
}