复杂链表的复制

复杂链表的复制

https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

浅拷贝就是两者共用一份内存地址,一个改变,另外一个跟着改变;深拷贝就是两者的内存地址是不一样的,互相独立的。
那么我们要怎么进行深拷贝呢?

肯定不可以直接将节点赋值给新的节点,这样就是引用了。所以我想到的是新建节点,然后新节点的值跟原来的节点的一样。
但是要怎么存储呢?因为我们深拷贝的新的链表,每一个节点都是跟原来链表一一对应的,但是是互相独立的,所以我就想到了HashMap,它不就是存储k-v键值对的吗,这样不就可以将两个节点一一对应起来。(这里的一一对应的意思是,知道哪个是哪个的深拷贝节点)
接着,我们还需要将新链表中的每个节点赋上next,random属性的值,那么我们就可以通过hashmap,通过key(原链表的节点),取出拷贝的节点,然后将这个key(旧节点)的两个属性值拷贝给新节点,这样不就很完美吗!

所以这道题就是看能不能想到用hashmap来解决了,当你想到的时候,那么一切问题将会变得非常的简单

public RandomListNode Clone(RandomListNode pHead)
    {
        HashMap<RandomListNode, RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
        RandomListNode p = pHead;
        //第一次遍历,新建立节点
        while(p != null){
            RandomListNode newNode = new RandomListNode(p.label);
            map.put(p,newNode);
            p = p.next;
        }

        p = pHead;
        //第二遍遍历 赋值对应的关系
        while(p != null){
            RandomListNode node = map.get(p);
            node.next = (p.next==null)?null:map.get(p.next);
            node.random = (p.random==null)?null:map.get(p.random);
            p = p.next;
        }
        return map.get(pHead);
    }
剑指offer 文章被收录于专栏

为刷过的每一道题都书写一篇题解,便于重复练习~

全部评论
大佬能否告知为什么是new RandomListNode(p.label);里面的p.label是做什么的?
点赞 回复 分享
发布于 2021-04-11 22:46

相关推荐

09-25 10:34
东北大学 Java
多面手的小八想要自然醒:所以读这么多年到头来成为时代车轮底下的一粒尘
点赞 评论 收藏
分享
11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
10 3 评论
分享
牛客网
牛客企业服务