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

复杂链表的复制

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

相关推荐

我是小红是我:学校换成中南
点赞 评论 收藏
分享
牛客263158796号:我领羊一面后十天不挂也不推进 今天问hr说等前序的第一批意向发完看情况再看是否推进
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务