1. 第一次遍历深度克隆链表费random属性,并使用map记录一一对应的链表节点
2. 第二次遍历,根据map记录的节点关系, 补全random引用
/**
* Definition for singly-linked list with a random pointer.
* class RandomListNode {
* int label;
* RandomListNode next, random;
* RandomListNode(int x) { this.label = x; }
* };
*/
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null){
return null;
}
Map<RandomListNode, RandomListNode> map = new HashMap<RandomListNode, RandomListNode>();
RandomListNode p = head;
RandomListNode headNew = new RandomListNode(head.label);
RandomListNode pNew = headNew;
map.put(p, pNew);
while (p != null){
RandomListNode next = p.next;
if(next == null){
break;
}
RandomListNode nextNew = new RandomListNode(next.label);
pNew.next = nextNew;
p = p.next;
map.put(next, nextNew);
pNew = pNew.next;
}
p = head;
pNew = headNew;
while (p != null){
RandomListNode rand = p.random;
RandomListNode randNew = map.get(rand);
pNew.random = randNew;
p = p.next;
pNew = pNew.next;
}
return headNew;
}
}