使用两个映射,二十行代码实现
复杂链表的复制
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; } }