力扣138.随机链表的复制

本文介绍了一种方法,如何在给定一个具有额外随机指针的链表时,通过递归和哈希表实现节点的深度复制,确保新链表与原链表的状态一致,即使随机指针可能指向链表中的任意节点。

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

示例 1:

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public: unordered_map<Node* ,Node*>cacheNnode;
    Node* copyRandomList(Node* head) 
    {
        if(head==nullptr){
            return nullptr;
        }
       if(!cacheNnode.count(head)){
           Node*headNew=new Node(head->val);
           cacheNnode[head]=headNew;
           headNew->next=copyRandomList(head->next);
           headNew->random=copyRandomList(head->random);
       }
       return cacheNnode[head];
    }
};

对一个特殊的链表进行深拷贝。如果是普通链表,我们可以直接按照遍历的顺序创建链表节点。而本题中因为随机指针的存在,当我们拷贝节点时,「当前节点的随机指针指向的节点」可能还没创建,因此我们需要变换思路。一个可行方案是,我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。

具体地,我们用哈希表记录每一个节点对应新节点的创建情况。遍历该链表的过程中,我们检查「当前节点的后继节点」和「当前节点的随机指针指向的节点」的创建情况。如果这两个节点中的任何一个节点的新节点没有被创建,我们都立刻递归地进行创建。当我们拷贝完成,回溯到当前层时,我们即可完成当前节点的指针赋值。注意一个节点可能被多个其他节点指向,因此我们可能递归地多次尝试拷贝某个节点,为了防止重复拷贝,我们需要首先检查当前节点是否被拷贝过,如果已经拷贝过,我们可以直接从哈希表中取出拷贝后的节点的指针并返回即可。

PACKAGE LT_Playback_100000VU rational 7.5 51E6DD992302 \COMPONENTS="LTvu:7.1:100000 LT_100000VT:8.0:10000"PACKAGE RSPS_TLA_500VU rational 1.5 F36CDEAC264E \COMPONENTS="PerformanceStudioSuite:1.0:10000 \LTmaster:7.1:10000 LTgui:7.1:5500 LTvu:7.1:5500 \LTjolt:7.1:10000 LTtux:7.1:10000 LTsql:7.1:10000 \LThttp:7.1:10000 LTsap:7.1:10000 LTcorba:7.1:10000 \LTdcom:7.1:10000"PACKAGE LT_All_VU_Protocols rational 7.5 F82D3FAA0615 \COMPONENTS=LT_All_Protocols:7.1:10000PACKAGE LoadTest_Base rational 7.5 652CC8FB1271 \COMPONENTS="LoadTestSuite:7.5:1 LTmaster:7.1:10000 \LTgui:7.1:10000 LTvu:7.1:5550 LThttp:7.1:10000"PACKAGE TMvtpool rational 8.0 3881689030FD \COMPONENTS=TMvirtualtester:8.0:5500INCREMENT RequisitePro rational 4.0 06-jan-2020 uncounted \BA0A38B7239E HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=146INCREMENT RationalSuiteEnterprise rational 4.0 06-jan-2020 uncounted \C93A81890161 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=76INCREMENT Robot rational 7.1 06-jan-2020 uncounted 76ABCAF51BB6 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="Rational Startup \License" ck=134INCREMENT LT_Playback_100000VU rational 7.5 06-jan-2020 uncounted \28D086A1F873 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=90INCREMENT LT_All_VU_Protocols rational 7.5 06-jan-2020 uncounted \AD87056FFA1A HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=110INCREMENT LoadTest_Base rational 7.5 06-jan-2020 uncounted \E9F6AA3DD21C HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=175INCREMENT TMvtpool rational 8.0 06-jan-2020 uncounted 7CB3BF1A82D4 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="Rational Startup \License" ck=169INCREMENT rose_windows_datamodeler rational 6.0 06-jan-2020 uncounted \9B6FB3990403 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=100INCREMENT rose_j_windows rational 6.0 06-jan-2020 uncounted \78294CFB428B HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=48INCREMENT rose_enterprise_windows rational 6.0 06-jan-2020 uncounted \31678567D95F HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=155INCREMENT rose_modeler_windows rational 6.0 06-jan-2020 uncounted \AC2794946BA5 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=126INCREMENT rose_cpp_windows rational 6.0 06-jan-2020 uncounted \D0D35BCFA41D HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=123INCREMENT rose_vb_windows rational 6.0 06-jan-2020 uncounted \5314E2E98DB3 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=94INCREMENT RoseRealTime rational 6.1 06-jan-2020 uncounted \6679AD7D1E1B HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=137INCREMENT RoseRealTimeStudio rational 6.1 06-jan-2020 uncounted \D5151A714D42 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=62INCREMENT TestManager rational 7.1 06-jan-2020 uncounted 6384C07DCED0 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=172INCREMENT soda_word rational 3.5 06-jan-2020 uncounted 7C8B36ED55E5 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=99INCREMENT ClearQuest rational 1.1 06-jan-2020 uncounted 058EEFBE94A0 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=107INCREMENT TestFactory rational 7.1 06-jan-2020 uncounted 146C066991C1 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=104INCREMENT LogViewer rational 7.1 06-jan-2020 uncounted 6793858AA163 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=104INCREMENT VisualPureCoverage rational 6.0 06-jan-2020 uncounted \7035145EBC30 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=19INCREMENT PurifyNT rational 6.0 06-jan-2020 uncounted 416E31D471BA \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=149INCREMENT VisualQuantify rational 6.0 06-jan-2020 uncounted \A6D02FA24CE7 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=129INCREMENT ClearQuest_TeamTest rational 1.1 06-jan-2020 uncounted \87734F711AAB HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=183INCREMENT ClearCase_LT rational 1.0 06-jan-2020 uncounted \E00C9EC5554A HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=138INCREMENT RationalProcessWorkbench rational 1.0 06-jan-2020 uncounted \9560F9A5EB76 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=128INCREMENT ProjectConsole rational 1.0 06-jan-2020 uncounted \BF8A8C9124B2 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=131INCREMENT xde_tester rational 1.5 06-jan-2020 uncounted EC1D6E76F26E \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=102INCREMENT xde_modeler rational 1.5 06-jan-2020 uncounted 4F1E37EA7C5F \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=172INCREMENT xde_pronet rational 1.5 06-jan-2020 uncounted 169A34BC9BB7 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=93INCREMENT xde_projava rational 1.5 06-jan-2020 uncounted EA0E78D6CCA0 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=167INCREMENT rose_ada_windows rational 6.0 06-jan-2020 uncounted \194E5D63FDD3 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=144INCREMENT Robot_PS rational 7.1 06-jan-2020 uncounted 7B2D58A396FB \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=118INCREMENT SoDA_Frame rational 3.0 06-jan-2020 uncounted 06780D8FFC2A \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=162INCREMENT LT_Playback_50VU rational 3.0 06-jan-2020 uncounted \32C768903CE0 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=73INCREMENT LT_Playback_100VU rational 3.0 06-jan-2020 uncounted \F2D366CF8B43 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=137INCREMENT LT_Playback_250VU rational 3.0 06-jan-2020 uncounted \00D4F6DEF293 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=156INCREMENT LT_Playback_500VU rational 3.0 06-jan-2020 uncounted \6F34FAC3736B HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=95INCREMENT LT_Playback_1000VU rational 3.0 06-jan-2020 uncounted \48CB5F9DE29B HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=177INCREMENT LT_Playback_2500VU rational 3.0 06-jan-2020 uncounted \1C1FDCE8313B HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=157INCREMENT LT_Playback_5000VU rational 3.0 06-jan-2020 uncounted \D45E43597237 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=91INCREMENT LT_Playback_10000VU rational 3.0 06-jan-2020 uncounted \64CDD5CB201A HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=140INCREMENT LT_Playback_20000VU rational 3.0 06-jan-2020 uncounted \7D8FFC26BA87 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=228INCREMENT LT_Playback_50000VU rational 3.0 06-jan-2020 uncounted \367E19BF3876 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=141INCREMENT LT_Playback_100000VU rational 3.0 06-jan-2020 uncounted \5C1B2FB38740 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=137INCREMENT ClearQuestMultiSite rational 1.0 06-jan-2020 uncounted \63767AAF4945 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=141INCREMENT TestRealTime rational 1.0 06-jan-2020 uncounted \0EF423DAF634 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=163INCREMENT TestRealTimeVT5 rational 1.0 06-jan-2020 uncounted \008637DD9DA6 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=167INCREMENT TestRealTimeVT25 rational 1.0 06-jan-2020 uncounted \46AFE69697C3 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=119INCREMENT TestRealTimeVT100 rational 1.0 06-jan-2020 uncounted \47B0421EC057 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=145INCREMENT TestRealTimeVT100Plus rational 1.0 06-jan-2020 uncounted \60D03F5E24CC HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=126INCREMENT xde_proplus rational 1.5 06-jan-2020 uncounted 6647DDE2E265 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=123INCREMENT Rose98_Unix rational 6.0 06-jan-2020 uncounted 71E0D1586BD9 \HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The Force Team - \2007" ck=174INCREMENT xde_modelernet rational 1.5 06-jan-2020 uncounted \8024020E717E HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=42INCREMENT xde_data_modeler rational 1.5 06-jan-2020 uncounted \CA7AEBE5CC41 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=201INCREMENT xde_data_modeler_net rational 1.5 06-jan-2020 uncounted \FF07C41571BC HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=103INCREMENT xde_proplusjava rational 1.5 06-jan-2020 uncounted \377F30CBB9A4 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=104INCREMENT xde_proplusnet rational 1.5 06-jan-2020 uncounted \B5E6326C4744 HOSTID=ANY ISSUER="THE FORCE TEAM" NOTICE="The \Force Team - 2007" ck=105
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值