给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
`
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
提示:
你必须返回给定头的拷贝作为对克隆列表的引用。
解答
首先创建一个node1 相同的链表node2,这个链表将random先置空。
用map 存储 node1 节点与 node2 节点对应关系。
最后设置random:
node2.random 指向自己链表中节点可以通过map.get(node1.random)获取
class Solution {
public Node copyRandomList(Node head) {
HashMap <Node,Node> map = new HashMap<Node,Node>();
Node node1 = head;
Node newhead = new Node();
Node node2 = newhead;
while(node1 != null) {//创建一个新链表
Node temp = new Node(node1.val,null,null); //创建值与node1 相同的节点。
node2.next = temp;
map.put(node1, temp); //将node1 节点与 node2中节点对应
node2 = node2.next;
node1 = node1.next;
}
node1 = head;
node2 = newhead.next;
while(node2 != null) {// 对node2 中的random 进行赋值,这个random是指向node2中的节点
node2.random = map.get(node1.random); //从map 中 拿出与node1 对应的node2
node1 = node1.next;
node2 = node2.next;
}
return newhead.next;
}
}
记录
另一种使用复制方法。1 2 3 变为 1 1 2 2 3 3。 根据前一个节点来设置后一个节点的random。
最后拆分为一个新链