【題目】
給定一個鏈表,每個節點包含一個額外增加的隨機指針,該指針可以指向鏈表中的任意節點或空節點。要求返回這個鏈表的深拷貝
【代碼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;
}
}