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

本文详细介绍了如何复制一个带有随机指针的链表,包括使用哈希表、原地修改链表结构以及深度优先搜索的解法。三种方法的时间复杂度均为O(N),空间复杂度分别为O(N)、O(1)和O(N)。通过这些方法,可以有效地在保持原始链表不变的情况下创建其深拷贝。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 题目描述
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。 
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 
表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。
  1. 题解
参考链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer/solution/liang-chong-shi-xian-tu-jie-138-fu-zhi-dai-sui-ji-/
1. 时间O(N),空间O(N)
2. 时间O(N),空间O(13. 时间O(N),空间O(N)
  1. 代码
class Solution {
public:
    Node* copyRandomList(Node* head) {
        if (!head) return NULL;
        map<Node*,Node*> mymap;
        Node* p=head;
        while (p){
            Node* tmp=new Node(0);
            mymap[p]=tmp;
            p=p->next;
        }
        for (auto m:mymap){
            m.second->val=m.first->val;
            m.second->random=mymap[m.first->random];
            m.second->next=mymap[m.first->next];
        }
        return mymap[head];
    }
};
/*
// 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 NULL;
        Node* p=head;
        while (p){
            Node* tmp=new Node(p->val);
            tmp->next=p->next;
            p->next=tmp;
            p=tmp->next;
        }
        p=head;
        while (p){
            if (p->random) p->next->random=p->random->next;
            else p->next->random=NULL;
            p=p->next->next;
        }
        Node* node=new Node(-1),*q=node;
        p=head;
        while (p){
            q->next=p->next;
            q=q->next;
            p->next=q->next;
            p=p->next;
        }
        return node->next;
    }
};
  1. 说明
1. 我们可以使用哈希表,建立链表中每个节点与深拷贝之后相应节点之间的映射关系,之后为其赋值,val
的值相等,next的值即为原链表next节点在map中的对应节点,random的值也为原链表random节点在map中
的对应节点。
2. 我们可以不必使用哈希表来建立映射关系,在原链表中的每个节点后插入和其值相同的节点,这样相邻两个
节点就建立了对应关系,节点的random值为其原节点random的next节点,最后再把拷贝之后的链表抽出来即
可。
3. 将其视作图来进行深度优先搜索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值