剑指 35. 复杂链表的复制

题目描述:

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

目录

1、拆分 

 2、哈希表


1、拆分 

具体实现步骤如下:

  1. 遍历原链表,复制每个节点,并将复制的节点插入到原节点的后面。
  2. 再次遍历链表,将复制节点的random指针指向对应原节点的random指针指向节点的下一个节点。
  3. 将链表拆分,得到复制链表。
/*
// 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 == NULL) {
        return NULL;
    }
    // 复制每个节点,并将复制的节点插入到原节点的后面
    Node* cur = head;
    while (cur != NULL) {
        Node* copy = new Node(cur->val);
        copy->next = cur->next;
        cur->next = copy;
        cur = copy->next;
    }
    // 设置复制节点的random指针
    cur = head;
    while (cur != NULL) {
        Node* copy = cur->next;
        if (cur->random != NULL) {
            copy->random = cur->random->next;
        }
        cur = copy->next;
    }
    // 拆分链表
    cur = head;
    Node* newHead = cur->next;
    while (cur != NULL) {
        Node* copy = cur->next;
        cur->next = copy->next;
        if (copy->next != NULL) {
            copy->next = copy->next->next;
        }
        cur = cur->next;
    }
    return newHead;
}
};
 2、哈希表

根据哈希表中存储的对应关系,将复制节点的next指针和random指针设置为正确的节点,从而构建出复制链表。

  1. 首先判断原链表是否为空,如果为空则直接返回null。
  2. 创建一个哈希表map,用于存储原链表节点和复制节点的对应关系。
  3. 第一次遍历原链表,创建复制节点,并将原节点和复制节点作为键值对存入哈希表中。
  4. 第二次遍历原链表,根据哈希表中存储的对应关系,设置复制节点的next指针和random指针。
  5. 返回哈希表中存储的头节点对应的复制节点。
class Solution {
public:
    Node* copyRandomList(Node* head) {
    if (head == NULL) {
        return NULL;
    }
    Node* cur = head;
    unordered_map<Node*, Node*> map;
    while (cur != NULL) {
        //原链表的当前节点cur作为键,而新创建的复制节点new Node(cur->val)作为值。
        map[cur] = new Node(cur->val);
        cur = cur->next;
    }
    cur = head;
    while (cur != NULL) {
        //复制节点的next指针指向正确的节点
        map[cur]->next = map[cur->next];
        //复制节点的random指针指向正确的节点
        map[cur]->random = map[cur->random];
        //将cur指针更新为下一个节点,继续遍历原链表的下一个节点
        cur = cur->next;
    }
    return map[head];
}
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值