C++实现LeetCode(138.拷贝带有随机指针的链表)

yizhihongxing

C++实现LeetCode(138.拷贝带有随机指针的链表)攻略

题意描述

给定一个链表,其中每个节点除了next指针外,还有一个random指针,指向链表中的任意节点或者null。请将该链表进行深度拷贝,并返回深度拷贝后的链表。

解题思路

方法一:哈希表

我们可以考虑定义一个哈希表,遍历原链表,建立原节点到新节点的映射关系,并在构建新链表时同时更新random指针的映射关系,最后返回新链表的头节点。具体实现细节请参见下面的代码。

class Solution {
public:
    typedef Node* node_ptr;
    Node* copyRandomList(Node* head) {
        unordered_map<node_ptr, node_ptr> node_map;

        node_ptr itr = head;
        while (itr) {
            node_map[itr] = new Node(itr->val);
            itr = itr->next;
        }

        itr = head;
        while (itr) {
            node_map[itr]->next = node_map[itr->next];
            node_map[itr]->random = node_map[itr->random];
            itr = itr->next;
        }

        return node_map[head];
    }
};

方法二:原地拷贝

另外,在处理该题时还有一种更为巧妙的方法,即原地进行拷贝。具体思想为:在原有链表上,每个节点后面都新增一个相似的节点,且在对这些新增节点进行赋值操作时,可以通过简单的访问即可找到每个新增节点的random指针指向的节点。接下来只需再对原有链表进行遍历,同时更新新链表节点间的指针映射关系,最后返回新链表的头节点即可。具体实现请参考下面代码。

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if (!head) return nullptr;

        Node* itr = head;
        while (itr) {
            Node* next = itr->next;

            Node* copy = new Node(itr->val);
            itr->next = copy;
            copy->next = next;

            itr = next;
        }

        itr = head;
        while (itr) {
            if (itr->random) itr->next->random = itr->random->next;
            itr = itr->next->next;
        }

        itr = head;
        Node* new_head = head->next;
        while (itr) {
            Node* copy = itr->next;
            itr->next = copy->next;
            if (copy->next) copy->next = copy->next->next;
            itr = itr->next;
        }

        return new_head;
    }
};

示例说明

示例一:

输入:

{7,null}
{13,0}
{11,4}
{10,2}
{1,0}

其中,上面每一行表示一个链表结构,每行两个数字中,第一个数字表示该节点的值,第二个数字表示该节点random指针指向的节点序号,在给定输入中,序号表示该节点在输入中出现的行数(从0开始计算)。

输出:

{7,null}
{13,0}
{11,4}
{10,2}
{1,0}

其中,该输出结果表明,输入数据所表示的链表进行深拷贝后,新的链表与输入链表完全一致。

示例二:

输入:

{1,1}
{2,1}

其中,上面的输入数据表示一个拥有两个节点的链表,其中第一个节点的random指针指向节点1。

输出:

{1,1}
{2,1}

经过深拷贝后,新的链表节点所存储的值和输入数据一致,并且random指针所指向的节点也正确。因此,输出结果与输入数据完全一致。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(138.拷贝带有随机指针的链表) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • JavaScript中匿名函数的用法及优缺点详解

    让我来详细讲解一下“JavaScript中匿名函数的用法及优缺点详解”。 什么是匿名函数 在JavaScript中,函数是一等公民(First-class Citizen),可以像变量一样被赋值、传递和使用。匿名函数(Anonymous Function)就是一种没有命名的函数,可以被直接赋值给变量,或者作为参数传递给其他函数。 对于常规函数,我们通常会定义…

    other 2023年6月26日
    00
  • iis 不能下载包含中文文件名的rar文件

    以下是详细讲解“iis 不能下载包含中文文件名的rar文件”的攻略: 问题描述 当使用IIS部署网站后,用户在下载包含中文文件名的rar文件时,可能会遇到下载文件失败的问题。 原因分析 IIS默认使用UTF-16编码,在处理包含中文字符的文件名时容易出现编码乱码的问题,导致下载失败。 解决方案 方案一:修改IIS配置文件 在IIS的配置文件中添加一个requ…

    other 2023年6月26日
    00
  • IE6,IE7下js动态加载图片不显示错误

    针对IE6、IE7下js动态加载图片不显示的问题,其原因在于浏览器缓存机制的不同导致。在IE6、IE7下,如果通过js动态创建img元素并赋值src属性加载图片,那么图片会被浏览器缓存下来并在后续使用时从缓存中读取。由于IE6、IE7存在缓存机制的限制,导致图片不易被获取。 为解决上述问题,可以采用以下两种方式进行处理: 方式一:添加随机参数 通过添加随机参…

    other 2023年6月25日
    00
  • win10补丁KB4587587推送 win10预览版20236.1005更新内容汇总

    Win10补丁KB4587587推送及Win10预览版20236.1005更新内容汇总攻略 1. Win10补丁KB4587587推送 Win10补丁KB4587587是微软最新推送的补丁,以下是该补丁的详细说明: 补丁名称: KB4587587 发布日期: 2023年7月27日 适用系统: Windows 10 适用版本: 所有版本 更新类型: 安全性更新…

    other 2023年7月27日
    00
  • ajax data属性传值的方式总结

    在前端开发中,我们经常需要使用ajax来向后端发送请求并获取数据。其中,data属性可以用于向后端传递参数。本文将介绍ajax data属性传值的方式总结的完整攻略,包括使用对象传值和使用JSON字符串传值两种方式,并提供两个示例说明。 1. 使用对象传值 使用对象传值需要遵循以下步骤: 创建一个对象,将需要传递的参数作为对象的属性。 var data = …

    other 2023年5月5日
    00
  • 为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题

    为vue-router懒加载时下载js的过程中添加loading提示避免无响应问题,可以通过以下步骤实现: 在路由配置中使用Webpack提供的代码分割功能,将各个路由对应的组件打包为单独的js文件,实现懒加载。具体代码示例: const Foo = () => import(‘./Foo.vue’) const Bar = () => impo…

    other 2023年6月25日
    00
  • react开发者工具reactdevelopertools的下载安装

    React开发者工具React Developer Tools的下载安装 React Developer Tools是一款非常有用的浏览器扩展程序,可以帮助React开发者更轻松地调试分析React应用程序。本攻略将详细介绍如何下载和安装React Developer Tools,包括Chrome和Firefox浏览器的安装方法两个示例说明。 Chrome浏…

    other 2023年5月7日
    00
  • PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat)

    PHP获取IP地址所在地信息的实例(使用纯真IP数据库qqwry.dat) 简介 在PHP中,我们可以使用纯真IP数据库(qqwry.dat)来获取IP地址所在地信息。这个数据库包含了大量的IP地址和对应的地理位置信息,我们可以通过查询IP地址在数据库中的记录来获取所需的信息。 步骤 1. 下载纯真IP数据库(qqwry.dat) 首先,我们需要下载纯真IP…

    other 2023年7月31日
    00
合作推广
合作推广
分享本页
返回顶部