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日

相关文章

  • python反转单链表算法题

    使用python实现反转单链表,可以分为迭代和递归两种方法。 迭代解法 迭代解法需要用到三个指针,分别是pre、cur和tmp。pre指向已翻转的链表,cur指向待翻转的链表,tmp用于保存cur的下一个节点。具体步骤如下: 定义pre为None,并将cur指向head节点。 遍历链表,当cur不为None时执行以下操作: 将tmp指向cur的下一个节点。 …

    other 2023年6月27日
    00
  • 倾力总结40条常见的移动端Web页面问题解决方案

    倾力总结40条常见的移动端Web页面问题解决方案 作者:XXX 本文将为大家介绍40条常见的移动端Web页面问题,以及相应的解决方案。以下为详细内容: 1. 移动端meta标签设置 在移动端开发中,meta标签设置非常重要,尤其是viewport的设置。通过添加以下meta标签,可以设置浏览器显示区域的大小,从而避免页面缩放问题: <meta name…

    other 2023年6月26日
    00
  • 关于Golang变量初始化/类型推断/短声明的问题

    首先我们来讲解一下Golang的变量初始化。 变量初始化 在Golang中,我们可以使用var关键字来声明一个变量,并对它进行初始化。变量初始化可以使用两种方式: 指定变量类型,使用赋值运算符”=”进行赋值 var a int a = 1 使用类型推断,通过赋值运算符”=”进行赋值 b := 2 这里需要注意的是,使用” :=” 进行变量初始化必须要在函数体…

    other 2023年6月20日
    00
  • JS构造函数和实例化的关系及原型引入

    JS中,构造函数是用于创建对象的特殊函数,用更直白的语言解释,构造函数其实就是一个模板,可以用来创建具有相同属性和方法的多个对象。 在JS中,我们可以通过函数的方式来创建一个构造函数,代码如下: function Person(name, age) { this.name = name; this.age = age; this.getInfo = func…

    other 2023年6月26日
    00
  • 通过OpenGL ES混合模式缩放视频缓冲区来适应显示尺寸

    实现视频缩放的基本思路是通过改变渲染纹理的顶点坐标和纹理坐标实现,其中OpenGL ES混合模式是一种可以较好地适应不同尺寸的方法。 具体实现方法如下: 初始化OpenGL ES环境,通过GLSurfaceView.Renderer的回调函数onSurfaceCreated实现。 @Override public void onSurfaceCreated(…

    other 2023年6月20日
    00
  • Win8系统Skydrive Pro右键菜单失灵无法使用的解决方法

    解决Windows 8系统SkyDrive Pro右键菜单失灵无法使用的方法: 步骤1:重新启用Office Upload Center- 首先打开“控制面板”,选择“程序”,再选择“程序和功能”。- 找到 Microsoft Office 2013,并右键选择“更改”。- 在出现的选项界面选择“添加或删除功能”,展开“Office共享功能”,找到“Offi…

    other 2023年6月27日
    00
  • deepqnetwork(dqn)原理解析

    Deep Q Network (DQN)原理解析 Deep Q Network (DQN)是一种可以将深度学习应用于强化学习的算法,由Google DeepMind公司在2015年提出。DQN旨在解决传统Q学习中状态空间过大的问题,在一定程度上缓解了强化学习中的稀疏奖励和延迟奖励问题。 Q-Learning 与 DQN DQN是基于Q-learning的改进…

    其他 2023年3月28日
    00
  • 如何在vite里获取env环境变量浅析

    下面是如何在vite中获取环境变量的攻略: 什么是环境变量 环境变量是一个在操作系统中存储的值,可以通过环境变量来指定程序运行时的一些参数和配置。在 Node.js 或者前端项目中也可以使用环境变量来存储一些敏感信息,如 API 密钥等。 Vite 中如何使用环境变量 Vite 中支持使用 import.meta.env 来获取到环境变量。import.me…

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