使用两个映射,二十行代码实现
复杂链表的复制
http://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba
思路:
1.第一次遍历旧链表:忽略random指针复制产生新链表,同时将相同位置的新节点到旧节点的映射存储在map1(这样我们就能够找到任意一个新节点对应的旧节点了),也将旧节点到新节点的映射存储在map2(这样就能够找到任意一个旧节点对应的新节点了)。
2.根据map1和map2来补充新链表中每个节点的random:对于任意一个新节点,此节点对应的旧节点的random节点的新节点就是此节点random应该指向的节点。
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
Map<RandomListNode,RandomListNode> oldToNew=new HashMap<>();
Map<RandomListNode,RandomListNode> newToOld=new HashMap<>();
RandomListNode newList=new RandomListNode(-1);
RandomListNode oldNode=pHead,newPre=newList;
while(oldNode!=null){
newPre.next=new RandomListNode(oldNode.label);
newPre=newPre.next;
oldToNew.put(oldNode,newPre);
newToOld.put(newPre,oldNode);
oldNode=oldNode.next;
}
for(RandomListNode newNode:newToOld.keySet()){
newNode.random=oldToNew.get(newToOld.get(newNode).random);
}
return newList.next;
}
}

