【30】复制带随机指针的链表(LeetCode 138)

复制带随机指针的链表

问题描述

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

要求返回这个链表的 深拷贝。

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

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

【注】深拷贝:深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。

解题思路

又是没有思路的一天…

最后是根据题解区的思路写出来的:

思路分三步:

①将新结点连接到每个旧结点的后面;
②新结点的random指向旧结点random的next;
③将新结点和旧结点分离成两个链表。

比如例子的步骤一:
【30】复制带随机指针的链表(LeetCode 138)
代码实现:

/*
// 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)
            return head;
        Node* cur = head;
        while(cur){ //将新结点加到原链表结点的后面
            Node* temp = new Node(cur->val);
            Node* q = cur->next;
            cur->next = temp;
            temp->next = q;
            cur = q;
        }
        cur = head;
        Node* new_cur = cur->next;
        while(cur){//将新结点的随机指针加上
            if(!cur->random)
                new_cur->random = NULL;
            else
                new_cur->random = cur->random->next;
            cur = new_cur->next;
            if(!cur) break;
            new_cur = cur->next;
        }
        Node* new_head = head->next;
        cur = head;
        new_cur = new_head;
        while(cur && cur->next){ //分离head和new_head
            cur->next = new_cur->next;
            cur =cur->next;
            if(!cur) break;
            new_cur->next = cur->next;
            new_cur = new_cur->next;
        }
        return new_head;
    }
};
上一篇:138. 复制带随机指针的链表_链表本地输入运行的问题


下一篇:【LeetCode】C++ :中等题 - 链表 138. 复制带随机指针的链表