剑指 Offer 35. 复杂链表的复制

剑指 Offer 35. 复杂链表的复制

  • 题目描述
  • 代码实现

题目描述

请实现 copyRandomList函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next指针指向下一个节点,还有一个 random指针指向链表中的任意节点或者 null。
示例 1:
剑指 Offer 35. 复杂链表的复制_第1张图片

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

示例 2:
剑指 Offer 35. 复杂链表的复制_第2张图片

输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]

示例 3:
剑指 Offer 35. 复杂链表的复制_第3张图片

输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]

示例 4:

输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof

代码实现

/*
// 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;
        map<Node*, Node*> orig2cp;
        Node* p = head;
        while(p != NULL){
            Node* copyed = new Node(p->val);
            orig2cp.insert(std::pair<Node*, Node*>(p, copyed));
            p = p->next;
        }
        p = head;
        while(p != NULL){
        	orig2cp[p]->next = (p->next) ? orig2cp[p->next] : NULL;
            orig2cp[p]->random = (p->random) ? orig2cp[p->random] : NULL;
            p = p->next;
        }
        return orig2cp[head];
    }
};

你可能感兴趣的:(剑指Offer)