使用两个映射,二十行代码实现

复杂链表的复制

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;
    }
}
全部评论

相关推荐

联通 技术人员 总包不低于12
点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务