首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:复制带随机指针的链表

#yyds干货盘点# LeetCode程序员面试金典:复制带随机指针的链表

时间:2023-06-22 17:01:21浏览次数:43  
标签:yyds head 金典 random 链表 null 节点 指针

题目:

给你一个长度为 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]]

示例 2:

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

输出:[[1,1],[2,1]]

示例 3:

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

输出:[[3,null],[3,0],[3,null]]

代码实现:

class Solution {
    Map<Node, Node> cachedNode = new HashMap<Node, Node>();

    public Node copyRandomList(Node head) {
        if (head == null) {
            return null;
        }
        if (!cachedNode.containsKey(head)) {
            Node headNew = new Node(head.val);
            cachedNode.put(head, headNew);
            headNew.next = copyRandomList(head.next);
            headNew.random = copyRandomList(head.random);
        }
        return cachedNode.get(head);
    }
}

标签:yyds,head,金典,random,链表,null,节点,指针
From: https://blog.51cto.com/u_13321676/6534988

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典:最短回文串
    1.简述:给定一个字符串s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例1:输入:s="aacecaaa"输出:"aaacecaaa"示例2:输入:s="abcd"输出:"dcbabcd"2.代码实现:classSolution{publicStringshortestPalindrome(Strings)......
  • 【代码设计】链表结构解决多流程校验
    目的使用合理的代码设计,解决业务场景的中的实际问题。背景介绍在实际的业务场景中,用户的一个操作行为,是否允许真正被执行,往往会涉及到多流程的校验,一旦有条件不满足将会被中止。以下面流程图为例:用户点击了打赏按钮,会进行是否有网络检查,没有网络,会有网络连接弹框,等待用户连接结果......
  • 链表程序(模板实现)
    本程序无法实现的功能就是想要头结点的数据域和其他结点的数据域类型不同,由于使用模板如果在构造函数的时候设置头结点的数据域类型,那么实例化的时候(LinkList<int>link;)其他结点数据域也要跟着变成整型,如果将头结点在构造函数中提前定义好(ListNode<int>*L=newListNode<int>;)......
  • 手写单双向链表
    手写双向链表双向链表类(BidirectionalLinkedList)publicclassBidirectionalLinkedList<E>{ //元素个数transientintsize=0;//0 //第一个节点transientNode<E>first;//null//最后一个节点transientNode<E>last;//null//添加类p......
  • 20230303 2.0. 数组和链表
    数组数组是最基本的构造类型,它是一组相同类型数据的有序集合。数组中的元素在内存中连续存放,用数组名和下标可以唯一地确定数组元素。链表链表是一种重要的基础数据结构,也是实现复杂数据结构的重要手段。它不按照线性的顺序存储数据,而是由若干个同一结构类型的“结点”依次......
  • 141. 环形链表 及其相关
    141.环形链表1.哈希表法:将节点依次加入set,如果有重复就是有环。publicclassSolution{publicbooleanhasCycle(ListNodehead){Set<ListNode>set=newHashSet<ListNode>();while(head!=null){if(!set.add(head)){......
  • SQL语句_链表(下)
    Store_Info表:store_namesalesdateA50001-01-2000B20002-01-2000A150002-10-2000D100003-08-2000Sales表:salesdate20002-01-2000100003-08-200060004-08-200075005-08-2000表链接查询除了可以使用JOIN,还可以使......
  • 关于线性结构中的双向链表如何实现?
    前言在上一篇文章中,主要是给大家介绍了单向链表的特点及其原理,但是我们没有通过代码进行练习。今天我会继续通过一篇文章,来给大家讲解双向链表的内容,尤其是会通过代码来进行链表的操作,希望大家重点关注哦。全文大约【3500】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!......
  • 单链表(双指针)
    #include<stdio.h>#include<stdlib.h>#include<time.h>typedefstructNode{intvalue;structNode*pNext;}Node;/*打印链表*/voidshow_data(Node*head){if(head==NULL){return;}Node*cur=head;......
  • 【数据结构】带头双向循环链表
    ......