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


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

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

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

    例如,如果原链表中有 XY 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 xy ,同样有 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]]
    

    提示:

    • 0 <= n <= 1000
    • -104 <= Node.val <= 104
    • Node.random 为 null 或指向链表中的节点。

    解析:

    都每个random都遍历一遍,看看是第几个就行

    然后用class数组链接即可

    /*
    // 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:
        Node* copyRandomList(Node* head) {
            if(head == nullptr) return nullptr;
            Node* p = head;
            int randomidex[1010];
            Node* node[1010];
            int i = 0, n = 0;
            while(p)
            {
                n++;
                node[i++] = new Node(p->val);
                p = p->next;
            }
            node[n] = nullptr;
            p = head, i = 0;
            while(p)
            {
                int cnt = 0;
                Node* q = p->random;
                while(q)
                {
                    q = q->next;
                    cnt++;
                }
                p = p->next;
                randomidex[i++] = n - cnt;
            }
            for(int i = 0; i < n; i++)
            {
                node[i]->random = node[randomidex[i]];
                if(i < n - 1) node[i]->next = node[i + 1];
            }
            node[n - 1]->next = nullptr;
            return node[0];
    
        }
    };
  • 相关阅读:
    [CF1198D] Rectangle Painting 1
    [CF696B] Puzzles
    [CF540D] Bad Luck Island
    [P1654] OSU!
    [P6154] 游走
    [CF1265E] Beautiful Mirrors
    [CF920F] SUM and REPLACE
    [CF453B] Little Pony and Harmony Chest
    [CF808D] Array Division
    [CF1155D] Beautiful Array
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16671126.html
Copyright © 2020-2023  润新知