[leetcode]138. Copy List with Random Pointer复制带有随机指针的链表

public RandomListNode copyRandomList(RandomListNode head) {
        /*
        深复制,就是不能只是复制原链表变量,而是做一个和原来链表一模一样的新链表,
        每一个节点都是新建的,而不是指向就节点
        这个题的难点在于:随机节点。
        随机节点有可能指向后边还没有建立的节点,这就没法指。
        方法一:一一对应地记录每个新旧节点的映射关系,在常规节点建立后,就去查哈希表,找到对应
        新节点的旧节点的random,就是新节点的random
         */
        if (head==null)
            return null;
        Map<RandomListNode,RandomListNode> map = new HashMap<>();
        //新节点
        RandomListNode n = new RandomListNode(head.label);
        //记住:二叉树、链表这种前后有关联的数据结构,要迭代(注意是迭代方式)遍历的时候,一定要建立一个结构代表当前节点,往下遍历(递归看情况)
        RandomListNode curN=n,curO=head;
        map.put(curO,curN);
        //先复制常规节点
        while (curO.next!=null)
        {
            //复制节点
            curN.next = new RandomListNode(curO.next.label);
            curN = curN.next;
            curO = curO.next;
            //建立映射
            map.put(curO,curN);
        }
        //复制random之前先初始化两个cur
        curN = n;
        curO = head;
        while (curN!=null)
        {
            if (curO.random!=null)
            {
                //通过映射找到random
                curN.random = map.get(curO.random);
            }
            curN = curN.next;
            curO = curO.next;
        }
        return n;
    }

 

转载于:https://www.cnblogs.com/stAr-1/p/8303849.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值