力扣经典150题第五十九题: 随机链表的复制

2024-05-12 11:04

本文主要是介绍力扣经典150题第五十九题: 随机链表的复制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

      • 1. 题目分析
      • 2. 解题思路
      • 3. Java代码实现
      • 4. 测试示例
      • 5. 总结

标题:使用Java实现随机链表的深拷贝

随机链表的深拷贝是一道经典的链表问题,需要在复制链表的同时处理随机指针。在本文中,我们将使用Java来解决LeetCode上的第五十九题,实现随机链表的深拷贝。

1. 题目分析

题目要求给定一个随机链表的头节点,我们需要复制该链表并返回复制链表的头节点。每个节点除了有普通的next指针外,还有一个random指针,指向链表中的任意节点或空节点。

2. 解题思路

为了实现随机链表的深拷贝,我们可以使用HashMap来存储原节点和复制节点之间的映射关系。具体步骤如下:

  • 第一次遍历:创建新节点,并将原节点和新节点的映射关系存储在HashMap中。
  • 第二次遍历:根据HashMap中的映射关系,复制原链表的next指针和random指针。

3. Java代码实现

import java.util.HashMap;
import java.util.Map;class Node {int val;Node next, random;public Node(int val) {this.val = val;this.next = null;this.random = null;}
}public class CopyRandomList {public Node copyRandomList(Node head) {if (head == null) return null;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) {map.get(cur).next = map.get(cur.next);map.get(cur).random = map.get(cur.random);cur = cur.next;}return map.get(head);}
}

4. 测试示例

我们使用几个示例来测试我们的代码:

public class Main {public static void main(String[] args) {// 示例1Node node1 = new Node(7);Node node2 = new Node(13);Node node3 = new Node(11);Node node4 = new Node(10);Node node5 = new Node(1);node1.next = node2; node2.next = node3; node3.next = node4; node4.next = node5;node2.random = node1; node3.random = node5; node4.random = node3; node5.random = node1;CopyRandomList solution = new CopyRandomList();Node copiedList1 = solution.copyRandomList(node1);printList(copiedList1);// 示例2Node node6 = new Node(1);Node node7 = new Node(2);node6.next = node7;node6.random = node7;node7.random = node7;Node copiedList2 = solution.copyRandomList(node6);printList(copiedList2);}public static void printList(Node head) {Node cur = head;while (cur != null) {System.out.print("[" + cur.val + ", ");if (cur.random != null) {System.out.print(cur.random.val);} else {System.out.print("null");}System.out.print("] ");cur = cur.next;}System.out.println();}
}

5. 总结

本文介绍了如何使用Java实现随机链表的深拷贝。通过HashMap来建立原节点和新节点之间的映射关系,实现了链表的深拷贝。这是一道经典的链表问题,在面试中也经常会被考察到。

这篇关于力扣经典150题第五十九题: 随机链表的复制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982443

相关文章

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

禁止复制的网页怎么复制

禁止复制的网页怎么复制 文章目录 禁止复制的网页怎么复制前言准备工作操作步骤一、在浏览器菜单中找到“开发者工具”二、点击“检查元素(inspect element)”按钮三、在网页中选取需要的片段,锁定对应的元素四、复制被选中的元素五、粘贴到记事本,以`.html`为后缀命名六、打开`xxx.html`,优雅地复制 前言 在浏览网页的时候,有的网页内容无法复制。比如「360

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图