首页 > 其他分享 >[LeetCode Hot 100] LeetCode138. 随机链表的复制

[LeetCode Hot 100] LeetCode138. 随机链表的复制

时间:2023-12-11 21:12:14浏览次数:33  
标签:Node cur random next 链表 Hot LeetCode138 节点

题目描述

思路一:添加"小弟"

  • 根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面。
  • 原节点i的随机指针(如果有的话),指向的是原节点j,那么新节点i的随机指针,指向的是原节点j的next
  • 最后将两个链表分开,再返回新链表就可以

思路二:使用哈希表

  • 首先创建一个哈希表,再遍历原链表,遍历的同时不断创建新节点
  • 将原节点作为key,新节点作为value放入哈希表中

  • 第二步再遍历原链表,这次我们将新链表的next和random指针给设置上

从上图中我们可以发现,原节点和新节点是一一对应的关系,所以

  • map.get(原节点),得到的就是对应的新节点
  • map.get(原节点.next),得到的就是对应的新节点.next
  • map.get(原节点.random),得到的就是对应的新节点.random

所以,我们只需要再次遍历原链表,然后设置:
新节点.next -> map.get(原节点.next)
新节点.random -> map.get(原节点.random)
这样新链表的next和random都被串联起来了
最后,我们然后map.get(head),也就是对应的新链表的头节点,就可以解决此问题了。

方法一:对应思路一

/*
// 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) {
        Node cur = head;
        // 根据遍历到的原节点创建对应的新节点,每个新创建的节点是在原节点后面
        while (cur != null) {
            Node newNode = new Node(cur.val);
            newNode.next = cur.next;
            cur.next = newNode;
            cur = cur.next.next;
        }
        // 如果当前节点存在random指针的话,则复制random指针
        for (Node temp = head; temp != null; temp = temp.next.next) {
            if (temp.random != null) {
                temp.next.random = temp.random.next;
            }       
        }
        // 将两个链表拆开
        // 因为这里涉及到新建链表,所以使用dummy节点的话会比较方便
        Node dummy = new Node(0);
        Node p = dummy, q = head;
        while (q != null) {
            p.next = q.next;
            q.next = q.next.next;
            q = q.next;
            p = p.next;
        }
        return dummy.next;
    }
}

方法二:对应思路二

/*
// 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) {
        // 创建一个哈希表,key是原节点,value是新节点
        Map<Node, Node> map = new HashMap<>();
        // 将原节点放入哈希表中
        Node cur = head;
        while (cur != null) {
            map.put(cur, new Node(cur.val));
            cur = cur.next;
        }
        cur = head;
        // 遍历原链表,设置新链表的next和random
        while (cur != null) {
            // cur是原节点,map.get(cur)是对应的新节点
            Node newNode = map.get(cur);
            if (cur.next != null) {
                //map.get(p.next)是原节点下一个节点对应的新节点
                newNode.next = map.get(cur.next);
            }
            if (cur.random != null) {
                newNode.random = map.get(cur.random);
            }
            cur = cur.next;
        }
        // 返回头节点
        return map.get(head);
    }
}

标签:Node,cur,random,next,链表,Hot,LeetCode138,节点
From: https://www.cnblogs.com/keyongkang/p/17895550.html

相关文章

  • [LeetCode Hot 100] LeetCode25. K个一组翻转链表
    题目描述思路:判断链表中是否足够k个元素再将这k个元素内部翻转一下将前后端点连接的指针变化一下方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*ListNode(intval)......
  • [持续更新][数据结构][算法]涵盖线性表、栈、链表、队列、图、动态规划、分治递归、回
    备考考点整理内部排序表格树的主要考点二叉树的常考紧紧抓住\(n_0=n_2+1\)\(n=n_0+n_1+n_2...n_m\)\(n=n_1+2*n_2+3*n_3...m*n_m\)+1哈夫曼树没有度为1的结点,也就是\(n_1=0\)完全二叉树常考总结最大岛屿问题(dfs模板)#include<iostream>#include<algorith......
  • 141. 环形链表
    1.题目介绍给你一个链表的头节点\(head\),判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪\(next\)指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数\(pos\)来表示链表尾连接到链表中的位置(索引从0开始)。注意:\(pos\)不作为参数进行......
  • Adobe Photoshop Elements 2024 v24.0 简体中文版 | 中文直装版
    下载:资源下载介绍:PhotoshopElements2024(简称PSE即PS简化版)是一款定位在数码摄影领域的全新的图像处理软件,该软件包括了专业版的大多数特性,只有少量的简化选项,提供了调整颜色和光线,去除划痕,修复旧照片,打开闭合的眼睛等实用功能,非常方便。除此之外,这款软件操作简单,使用方......
  • 234. 回文链表
    题目介绍给你一个单链表的头节点\(head\),请你判断该链表是否为回文链表。如果是,返回\(true\);否则,返回\(false\)。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围\([1,10^{5}]\)内\(0<=Node.val<=9\)进......
  • Adobe Photoshop 2023最新激活(附图文教程)
    以前PS喜欢用这个,不过现在简单搞搞在手机上也能搞定。好久不用了,但偶尔需要用的时候还挺麻烦。有专业需求的小伙伴拿走不谢。介绍Photoshop软件是一个非常强大的数字图像处理和编辑软件,具有直观易用的用户界面,各种图像编辑和处理工具,各种图层和蒙版功能,各种滤镜和插件。无论是初学......
  • 代码 测试用例 测试结果 测试结果 24. 两两交换链表中的节点
    给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[]示例3:输入:head=[1]输出:[1] 提示:链表中节点的数目在范围 [0,100] 内......
  • 160.相交链表
    1.题目介绍给你两个单链表的头节点 \(headA\)和\(headB\),请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回\(null\)。图示两个链表在节点\(c1\)开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构......
  • [LeetCode Hot 100] LeetCode155. 最小栈
    题目描述思路一:使用辅助栈定义一个[数据栈]来支持push、pop、top操作定义一个[辅助栈],其栈顶为当前的最小值,以支持常数时间复杂度的getMin操作思路二:使用ArrayDeque栈元素中除了保存当前值之外,额外保存当前最小值使用静态内部类方法一:对应思路一classMinStack{......
  • 【JavaSE】数据结构(栈、队列、数组、链表)
    什么是数据结构?数据结构是计算机底层存储、组织数据的方式,是指数据相互之间是什么方式排列在一起的常见的数据结构栈、队列、数组、链表二叉树、二叉查找树、平衡二叉树、红黑树哈希表栈特点:先进后出队列特点:先进先出数组特点:有索引,内存连续优点:查询速度快O(1)缺点:增......