首页 > 编程语言 >【算法】【线性表】【链表】随机链表的复制

【算法】【线性表】【链表】随机链表的复制

时间:2024-01-16 09:04:45浏览次数:38  
标签:Node node 线性表 random 链表 算法 null 节点

1  题目

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

提示:

  • 0 <= n <= 1000
  • -104 <= Node.val <= 104
  • Node.random 为 null 或指向链表中的节点。

2  解答

一个Map 很巧妙的解决:

/*
// Definition for a Node.
class Node {
    int val;
    Node next;
    Node random;

    public Node(int val) {
        this.val = val;
        this.next = null;
        this.random = null;
    }
}
*/

class Solution {
    public Node copyRandomList(Node head) {
        // 参数边界校验
        if (head == null) {
            return head;
        }
        // 深拷贝主要是有一个随机的random
        // 而快速查找的话 其实就是map
        Node node = head;
        // 记录旧node 和 新 node 的映射
        Map<Node, Node> nodeMap = new HashMap<>();

        while (node != null) {
            Node newNode = new Node(node.val);
            nodeMap.put(node, newNode);
            node = node.next;
        }

        // 再遍历一遍主要是设置 next random
        node = head;
        while (node != null) {
            // 旧链表的节点
            Node nextNode = node.next;
            // 新链表对应的节点
            Node newNode = nodeMap.get(node);
            if (Objects.nonNull(nextNode)) {
                // next元素 赋值给新链表
                newNode.next = nodeMap.get(nextNode);
            }

            // 旧链表节点的 random
            Node randomNode = node.random;
            if (Objects.nonNull(randomNode)) {
                // 赋值给新链表的 random
                newNode.random = nodeMap.get(randomNode);
            }
            
            // 继续循环
            node = node.next;
        }

        return nodeMap.get(head);
        
    }
}

加油。

标签:Node,node,线性表,random,链表,算法,null,节点
From: https://www.cnblogs.com/kukuxjx/p/17966751

相关文章

  • 【算法】【线性表】【链表】环形链表
    1 题目给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从0开始)。注意:pos 不作为参数进行传递 。仅......
  • 人工智能选股框架及经典算法简介
    人工智能和机器学习并不神秘人工智能和机器学习方法并不神秘,其本质是以数理模型为核心工具,结合控制论、认知心理学等其它学科的研究成果,最终由计算机系统模拟人类的感知、推理、学习、决策等功能。理解常用的机器学习算法,有助于澄清对人工智能的种种误解和偏见,帮助我们更清晰地认......
  • 算法模板 v1.1.1
    算法模板编译CF模板#include<bits/stdc++.h>usingnamespacestd;/*====================*/#defineendl"\n"/*====================*/typedeflonglonglnt;/*====================*/voidSolve(void){}/*====================*/intmain(){#ifn......
  • R语言关联规则模型(Apriori算法)挖掘杂货店的交易数据与交互可视化
    原文链接:http://tecdat.cn/?p=22732 原文出处:拓端数据部落公众号 关联规则挖掘是一种无监督的学习方法,从交易数据中挖掘规则。它有助于找出数据集中的关系和一起出现的项目。在这篇文章中,我将解释如何在R中提取关联规则。关联规则模型适用于交易数据。交易数据的一个例子可以......
  • 【算法】莫比乌斯反演
    参考博客OI-Wiki|Biuld-数学|Million-组合计数学习笔记|狄利克雷卷积和莫比乌斯反演|算法学习笔记(35):狄利克雷卷积狄利克雷卷积莫反的前置知识,主要引入了一个新运算。常用积性函数单位函数\(\varepsilon(n)=\begin{cases}1&n=1\\0&\text{otherwise}\end{cases}......
  • 吴师兄学算法day07 双指针 680. 验证回文串 II
    题目:680. 验证回文串II易错点:s[1:3]是左闭右开我的第一次代码:classSolution(object):defvalidPalindrome(self,s):""":types:str:rtype:bool"""isPalindrome=lambdax:x==x[::-1]l......
  • 算法练习 1.寻找中心下标(Find the Middle Index in Array)
    算法练习1.寻找中心下表(FindtheMiddleIndexinArray)题目来源来源:力扣(LeetCode)https://leetcode-cn.com/problems/find-the-middle-index-in-array/题目描述给你一个整数数组nums,请计算数组的中心下标。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有......
  • Snowflake算法生成Id
    网上大部分C#写的都有点乱糟糟,我简化了一下:usingSystem;namespacexxx{///<summary>///Id生成类///</summary>classSnowflake{privateconststringLOCK_OBJ="76003AEB-E3F9-460A-BD31-D9AE9E7684C0";privatecon......
  • 聚类算法学习总结
    1.1聚类的定义聚类(Clustering)是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。也即聚类后同一类的数据尽可能聚集到一起,不同类数据尽量分离。1.2聚类和分类的区别......
  • leetcode 19.删除链表的倒数第N个节点
    leetcode19.删除链表的倒数第N个节点第十九题:删除链表的倒数第N个节点在对链表进行操作时,一种常用的技巧是添加一个哑节点(dummynode),它的next指针指向链表的头节点。这样一来,我们就不需要对头节点进行特殊的判断了。例如,在本题中,如果我们要删除节点y,我们需要知道节点y的前......