首页 > 其他分享 >138. 复制带随机指针的链表

138. 复制带随机指针的链表

时间:2023-09-11 17:22:48浏览次数:32  
标签:Node cur random next 链表 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 作为传入参数。


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

> 解法一
(迭代) O(n)

定义一个 p 指针,遍历整个链表,复制每个节点,并将原链表和复制链表连在一起。
2、再次遍历整个链表,执行 p->next->random = p->random->next,复制 random 指针。
3、定义虚拟头节点 dummy 用来指向复制链表的头节点, 将两个链表拆分并复原原链表


class Solution {
public:
    Node* copyRandomList(Node* head) {
        for(auto p = head; p; p = p->next->next)  //复制每个节点,并将原链表和复制链表连在一起。
        {
            auto q = new Node(p->val);
            q->next = p->next;
            p->next = q;
        }

        for(auto p = head; p; p = p->next->next)   //复制random指针
        {
            if(p->random)
              p->next->random = p->random->next;
        }

        //拆分两个链表,并复原原链表
        auto dummy = new Node(-1), cur = dummy; 
        for(auto p = head; p; p = p->next)
        {
            auto q = p->next;
            cur = cur->next = q;
            p->next = q->next;
        }

        return dummy->next;
    }
};

> 解法二
哈希表


class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(!head)  return head;
        unordered_map<Node*,Node*> mp;
        Node* startdex = new Node(head->val);
        mp[head] = startdex;
        Node* cur = startdex;
        Node* old = head->next;
        while(old){
            Node* node = new Node(old->val);
            cur -> next = node;
            cur = cur -> next;
            mp[old] = cur;
            old = old->next;
        }
        cur = startdex;
        old = head;
        mp[nullptr] = nullptr;
        while(cur){
            Node* node_old = old -> random;
            cur -> random = mp[node_old];
            cur = cur -> next;
            old = old -> next;
        }
        return startdex;
    }
};

标签:Node,cur,random,next,链表,138,节点,指针
From: https://www.cnblogs.com/lihaoxiang/p/17694011.html

相关文章

  • 转动指针,转动拨盘
    初始效果图(左), 转动指针效果图(中),转动拨盘效果图(右)   代码如下:intcenterX=124;intcenterY=124;privatevoidForm1_Load(objectsender,EventArgse){varbmp=GetPointerImg(Resources.valsalvaThresholdPointer,......
  • 例2.9 建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放
    1.题目例2.9建立一个带头结点的线性链表,用以存放输人的二进制数,链表中每个结点的data域存放一个二进制位。并在此链表上实现对二进制数加1的运算。2.算法分析3.代码/*二进制加1*/voidBinAdd(LinkListl){inttemp;Node*pa=l->next,*pb,*s;while(pa......
  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • BUG1-野指针问题
    问题 像是第27行,对指针声明却未赋初值,就会成为野指针。会导致意料之外的结果。这里我遇到的是程序卡死,当按下KEY_UP时,程序就会卡死。      解决赋个值,让wTemp指向Num1的地址 ......
  • 18、复合类型之指针(P47、P48、P49、P50);C++ primer 2.3.2
    1、C++中的“声明符”是什么?声明符是用来指定变量或函数的类型、名称和属性的符号。例如:intlist[20]; 声明了一个名为list的整型数组,它有20个元素。int是类型说明符,list[20]是声明符char*cp; 声明了一个名为cp的指向字符的指针1。*cp是声明符doublefunc(void);......
  • Icoding 链表 删除范围内结点
    题目:已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度。链表结点定义如下:struct_lnklist{ElemTypedata;struct_lnklist*next;};typedefstruct......
  • 链表
            ......
  • java版本剑指offer:链表中倒数最后k个结点
    java版本剑指offer:链表中倒数最后k个结点描述输入一个链表,输出一个链表,该输出链表包含原链表中从倒数第k个结点至尾节点的全部节点。如果该链表长度小于k,请返回一个长度为0的链表。最简单的方式就是使用两个指针,第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针......
  • java版本剑指offer:反转链表
    java版本剑指offer:反转链表描述输入一个链表,反转链表后,输出新链表的表头。示例1输入:{1,2,3}返回值:{3,2,1}此题想考察的是:如何调整链表指针,来达到反转链表的目的。初始化:3个指针:1)pre指针指向已经反转好的链表的最后一个节点,最开始没有反转,所以指向null2)cur指针指向待反转链表......
  • java剑指offer:两个链表的第一个公共结点
    java剑指offer:两个链表的第一个公共结点描述输入两个无环的单链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)解题思路:先假设链表A头结点与结点8的长度与链表B头结点与结点8的长度相等,那么就可以用双指针。......