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

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日

相关文章

  • 计算机ip地址设置 自动获取IP和静态IP

    计算机IP地址设置攻略 IP地址是计算机在网络中的唯一标识,它可以通过两种方式进行设置:自动获取IP和静态IP。下面是详细的攻略,包含了两个示例说明。 自动获取IP 自动获取IP是指计算机通过动态主机配置协议(DHCP)从网络中的路由器或服务器自动获取IP地址。这是最常见的设置方式,适用于大多数家庭和办公网络。 以下是设置自动获取IP的步骤: 打开计算机的网…

    other 2023年7月29日
    00
  • 史上最牛的WINDOWS系统文件详解第1/3页

    首先,需要明确“史上最牛的WINDOWS系统文件详解第1/3页”指的是什么。这是一篇论文或者文章的标题,猜测是关于对WINDOWS系统文件的详细解析和分析。 文章的攻略可以分为以下几个步骤: 1.阅读文章,理解其主要内容和结构。 2.了解WINDOWS系统文件的基本概念和结构,包括文件类型、存储路径、权限等。 3.分析文章中给出的示例,理解其中的具体细节和原…

    other 2023年6月27日
    00
  • Win10 Mobile Redstone版本号确定为Build 11082明年发布

    以下是关于“Win10 Mobile Redstone 版本号确定为 Build 11082 明年发布”的完整攻略,包含了两个示例说明。 确定版本号 根据消息,Win10 Mobile Redstone 的版本号确定为 Build 11082。这意味着在明年发布时,该版本的 Win10 Mobile 将具有该特定的版本号。 示例说明 示例一:Win10 Mo…

    other 2023年8月2日
    00
  • C 语言基础—-详解C中的运算符

    C语言基础—-详解C中的运算符 算术运算符 C语言中常用的算术运算符包括加、减、乘、除和取余等。下面我们来分别介绍这些运算符: 加法运算符 + 加法运算符用于对两个操作数进行加法运算,并返回两个操作数之和。例如: int a = 10; int b = 20; int c = a + b; 上面的示例中,变量c的值为30,也就是a和b的和。 减法运算符 …

    other 2023年6月27日
    00
  • Python基础教程之if判断,while循环,循环嵌套

    Python基础教程之if判断,while循环,循环嵌套攻略 本攻略将详细讲解Python中的if判断、while循环和循环嵌套的用法和示例。这些是Python编程中非常重要的基础知识,掌握它们可以帮助你编写更加灵活和高效的代码。 if判断 if判断是一种条件语句,用于根据条件的真假执行不同的代码块。它的基本语法如下: if 条件: # 条件为真时执行的代码…

    other 2023年7月28日
    00
  • 如何用命令行进入mysql具体操作步骤

    当我们需要进入MySQL数据库进行数据操作的时候,可以通过命令行进行进入。下面是使用命令行进入MySQL的具体步骤: 步骤一:打开终端 在Windows系统下,可以通过“开始菜单-搜索-运行”并输入cmd命令来打开终端;在Mac OS、Linux等Unix-like系统下,则可以通过打开终端应用程序来进入终端。 步骤二:输入命令 在终端中输入以下命令来进入M…

    other 2023年6月26日
    00
  • Ghost8.0详细使用方法与命令行参数

    Ghost 8.0 详细使用方法与命令行参数攻略 Ghost 8.0 是一款流行的博客平台,使用命令行来控制和管理博客。在本攻略中,我们将介绍 Ghost 8.0 的详细使用方法和常用的命令行参数。 安装 Ghost 8.0 首先,需要在系统上安装 Node.js 和 npm。接着,在命令行工具中运行以下命令来安装 Ghost-CLI: npm instal…

    other 2023年6月26日
    00
  • PHP递归实现层级树状展开

    下面是详细的“PHP递归实现层级树状展开”的完整攻略: 什么是递归? 递归是一种计算机科学的基础概念,指的是在函数的定义里面又调用了该函数自身的行为。递归可以使算法变得简单且易于理解,但是如果没有终止条件或者递归深度过大,会导致内存资源的浪费或者栈溢出等问题。 什么是层级树状结构? 层级树状结构是一种常见的数据结构,它是由多个节点组成的树形结构,每个节点可以…

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