本题目一共有两种解决方法,一种是使用HashMap存储键值对,另一种方法是原地复制;
解法一:使用HashMap存储键值对
/*
// Definition for a Node.
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
*/
//第一种方法使用HashMap方法方法
class Solution {
public Node copyRandomList(Node head) {
if(head==null){
return null;
}
//将节点复制到到键值对中
Node node=head;
Map<Node,Node> map=new HashMap<>();
while(node!=null){
Node clone=new Node(node.val);
map.put(node,clone);
node=node.next;
}
node=head;
//复制随机域
while(node!=null){
map.get(node).next=map.get(node.next); //随机立减
map.get(node).random=map.get(node.random);
node=node.next;
}
return map.get(head);
}
}
解法二:原地复制
class Solution {
public Node copyRandomList(Node head) {
if(head==null){
return null;
}
//原地复制节点
Node current=head;
while(current!=null){
Node clone=new Node(current.val);
Node temp= current.next;
clone.next=current.next;
current.next=clone;
current=temp;
}
//处理随机节点,要注意画图和校验
current=head;
while(current!=null){
if(current.random!=null){
current.next.random=current.random.next;
}
current=current.next.next;
}
///将两个链表拆开
Node newHead=new Node(-1);
newHead=head.next;
current=head;
while(current.next!=null){
Node temp=current.next;
current.next=current.next.next;
current=temp;
}
return newHead;
}
}