138. 复制带随机指针的链表 力扣(中等) 哈希+链表

题目描述:

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

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

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

题源:https://leetcode-cn.com/problems/copy-list-with-random-pointer/

题解: 就是完全复制一个一模一样的链表,但是和原来的链表没有节点重复

需要学习的就是对链表节点指针的理解:

  • Node(val)           创建的是一个节点,不是指针;
  • new Node(val)     是一个指向这个节点的指针

代码:

/*
// 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;

    map<Node*,Node*> mp;
    Node* head2= new Node(head->val);  // Node* head2=Node(head->val) 错误
    Node* cur1=head;
    Node* cur2=head2;
    
    while(cur1!=NULL)
    {
        mp[cur1]=cur2;   //  构建映射,也就是hash
        if(cur1->next==NULL) break;
        cur2->next=new Node(cur1->next->val);  // 需要 new在前面
        cur1=cur1->next;
        cur2=cur2->next;
    }
    cur1=head;
    cur2=head2;
    while(cur1!=NULL)
    {
        if(cur1->random==NULL) cur2->random = NULL;
            else cur2->random=mp[cur1->random];
        cur1=cur1->next;
        cur2=cur2->next;
    }
    return head2;
    }
};

今天的力扣崩了,一直出现内部错误。。。

原文地址:https://www.cnblogs.com/stepping/p/15046452.html