【题目】
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任意节点或空节点。要求返回这个链表的深拷贝
【代码1】
时间复制度O(n),空间复制度O(n)
class Solution {
public Node copyRandomList(Node head) {
Node cur = head;
Map<Node, Node> map = new HashMap<Node, Node>();
while(cur != null){
map.put(cur, new Node(cur.val));
cur = cur.next;
}
cur = head;
while(cur != null){
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
cur = cur.next;
}
return map.get(head);
}
}
###【代码2】
时间复制度O(n),空间复杂度O(1)
class Solution {
public Node copyRandomList(Node head) {
if(head == null){
return null;
}
Node random = null;
//1.每一个真实的节点后面加入一个拷贝节点
Node node = head;
while(node != null){
Node copyNode = new Node(node.val);
Node nextNode = node.next;
node.next = copyNode;
copyNode.next = nextNode;
node = nextNode;
}
node = head;
//2.copy Random节点
while(node != null){
Node nextNode = node.next.next;
Node nodeRandom = node.random;
if(nodeRandom == null){
node.next.random = null;
}else{
node.next.random = nodeRandom.next;
}
node = nextNode;
}
node = head;
random = node.next;
Node resultNode = random;
//3.获得copy节点
while(node != null){
Node nextNode = node.next.next;
Node randomNext = random.next == null ? null: random.next.next;
node.next = nextNode;
random.next = randomNext;
node = nextNode;
random = randomNext;
}
return resultNode;
}
}