Copy List with Random Pointer

Clone Graph 的实现细节上有些相似的地方,都要用个map记住已存在结点和新建结点之间的映射。循环两遍,空间O(N).

public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head == null) return null;
RandomListNode newHead = new RandomListNode(head.label);
HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
map.put(head, newHead);
for(RandomListNode node = head; node.next != null; node = node.next) {
RandomListNode newNext = new RandomListNode(node.next.label);
map.get(node).next = newNext;
map.put(node.next, newNext);
}
for(RandomListNode node = head; node != null; node = node.next) {
map.get(node).random = map.get(node.random);
}
return newHead;
}
}

也可以不用HashMap。

public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head == null) return null;
for(RandomListNode node = head; node != null; node = node.next.next) {
RandomListNode newNode = new RandomListNode(node.label);
newNode.next = node.next;
node.next = newNode;
}
for(RandomListNode node = head; node != null; node = node.next.next) {
if(node.random != null) {
node.next.random = node.random.next; //这一步是精华  

}
}
RandomListNode newHead = head.next;
for(RandomListNode node = head, newNode = newHead; node != null; node = node.next) {
node.next = newNode.next;
if(newNode.next != null) {
newNode.next = newNode.next.next;
}
newNode = newNode.next; //别忘了newNode也要往后走一步! 

}
return newHead;
}
}


posted @ 2014-12-29 01:58  江南第一少  阅读(98)  评论(0)    收藏  举报