给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
/*
// Definition for a Node.
class Node {
public int val;
public Node next;
public Node random;
public Node() {}
public Node(int _val,Node _next,Node _random) {
val = _val;
next = _next;
random = _random;
}
};
*/
class Solution {
public Node copyRandomList(Node head) {
//方法一
if(head==null) return null;
// 1.遍历原链表,拿到一个节点后,创建一个值相等的新节点,然后构成键值对插入到Map中。
Map<Node,Node> m=new HashMap<>();
Node node=head;
while(node!=null){
m.put(node,new Node(node.val));
node=node.next;
}
// 2.给新节点的next和随机指针域进行赋值
node=head;
while(node!=null){
// 赋值next
m.get(node).next=m.get(node.next);
m.get(node).random=m.get(node.random);
node=node.next;
}
return m.get(head);
//方法二
// if(head==null){
// return null;
// }
// //1.将老新节点 串为一个链表
// Node cur=head;
// while(cur!=null){
// Node node=new Node(cur.val,cur.next,null);
// Node tmp=cur.next;
// cur.next=node;
// cur=tmp;
// }
// //2.开始解决random指针
// cur=head;
// while(cur!=null){
// if(cur.random!=null){
// cur.next.random=cur.random.next;
// }else{
// cur.next.random=null;
// }
// cur=cur.next.next;
// }
// //3.拆分链表
// cur=head;
// Node newHead=cur.next;
// while(cur.next!=null){
// Node tmp=cur.next;
// cur.next=tmp.next;
// cur=tmp;
// }
// return newHead;
}
}