zoukankan      html  css  js  c++  java
  • 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;
        }
    };

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

  • 相关阅读:
    Android GzipOutputStream、GzipInputStream用法
    JAVA中String类的intern()方法的作用
    Android中解析XML
    Android 实现Xmpp工具类
    Android 用SSL构建安全的Socket
    Android ReentrantLock
    ReentrantLock与synchronized
    Android 使用MediaMetadataRetriever类获取视频第一帧及用法
    Android 关于android布局的两个属性dither和tileMode
    Hadoop MapReduce编程 API入门系列之倒排索引(二十四)
  • 原文地址:https://www.cnblogs.com/stepping/p/15046452.html
Copyright © 2011-2022 走看看