百度电话面试题——复制带随机指针的链表,你学会了吗?

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 百度电话面试题——复制带随机指针的链表,你学会了吗?,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

此题本身其实并不难,难就难在——面试的高压环境下,你能想到吗?

不要害怕,冷静分析,心态放稳,相信你一定可以!

接下来请看题:力扣

百度电话面试题——复制带随机指针的链表,你学会了吗?

 分析:

       题的大致意思就是说,让你复制一个和题目给出的相同链表,但是是深拷贝,同时每个结点还有一个随机的引用,所以就要小心,不是让你将next和random的值原封不动的照搬过来

思路:

1.可以创建一个HashMap,通过遍历待拷贝链表,使待拷贝的结点引用与创建的新结点的结点的引用联系起来,同时将val值进行拷贝,假设如下图:

百度电话面试题——复制带随机指针的链表,你学会了吗?

百度电话面试题——复制带随机指针的链表,你学会了吗?

 2.接下来让新链表的每个结点通过HashMap的一一对应关系连接起来,同时将random的连接起来,如下图:

百度电话面试题——复制带随机指针的链表,你学会了吗?

3.提问:next的连接好理解,那么random使如何的连接呢?

        通过HashMap表的对应关系,例如上图的新链表的第二个结点和第一个结点的连接:那么假设用来遍历的cur指向了待拷贝链表的第二个结点0x16,则不难想到hashMap.get(cur)是拿到了新链表的0x26处的结点,那么再深入一点,hashMap.get(cur.random)不就是找到新链表中的0x26结点的random该指向的结点了吗?(0x16结点处的random是0x12,0x12作为hashMap的key值,通过get就可以找到val值0x22,此时就找到了0x26结点处的random所因该指向的结点


代码如下:

    public Node copyRandomList(Node head) {
        Node cur = head;
        Map<Node, Node> hashMap = new HashMap<>();
        /**
         *  先遍历一遍链表,并创建新链表给val赋值
         *  再给给hashMap分别赋值待被拷贝的链表结点地址和新创建的结点地址,使其对应起来
         */
        while(cur != null){
            Node node = new Node(cur.val);
            hashMap.put(cur, node);
            cur = cur.next;
        }
        //先让新链表连接起来,并把random赋给新结点
        cur = head;
        while(cur != null){
            hashMap.get(cur).next = hashMap.get(cur.next);
            hashMap.get(cur).random = hashMap.get(cur.random);
            cur = cur.next;
        }
        return hashMap.get(head);
    }

百度电话面试题——复制带随机指针的链表,你学会了吗?

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130458.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!