返回顶部
首页 > 资讯 > 后端开发 > Python >java算法题解LeetCode35复杂链表的复制实例
  • 526
分享到

java算法题解LeetCode35复杂链表的复制实例

java算法复杂链表复制javaLeetCode 2023-01-05 12:01:19 526人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录题目示例 1:示例 2:示例 3:示例 4:解题思路题目 AC 剑指 Offer 35. 复杂链表的复制请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中

题目

AC 剑指 Offer 35. 复杂链表的复制请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例 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]]

示例 4:

输入:head = [] 输出:[] 解释:给定的链表为空(空指针),因此返回 null。

提示: -10000 <= node.val <= 10000 Node.random 为空(null)或指向链表中的节点。 节点数目不超过 1000 。

解题思路

哈希的做法,在大多数公司的面试官面前并不是一个满意的答案,所以需要知道原地修改的解法才能够从容面对面试。 原地修改解法流程: 假设三个节点初始如下

1.第一次遍历,复制一个新的节点在原有节点之后,如 1 -> 2 -> 3 -> null 复制完就是 1 -> 1 -> 2 -> 2 -> 3 - > 3 -> null 第一次遍历,构建的节点,random还未连接起来,如下图

我们需要把A指向C,因为初始的A的random指针指向了C,那是不是有这样的公式: A->random = A->random->next

2.第二次遍历,从头开始遍历链表,通过 cur.next.random = cur.random.next 可以将复制节点的随机指针串起来,当然需要判断 cur.random 是否存在

3.第三次遍历,就比较简单了,只是找出这些相邻节点,组成结果就可以

class Solution {
	public Node copyRandomList(Node head) {
		// if head == null,则return null
		if (head == null) {
			return null;
		}
		// 第一次遍历, 1 -> `1` -> 2 -> `2` -> 3 - > `3` -> null
		Node cur = head;
		while (cur != null) {
			Node node = new Node(cur.val);
			Node temp = cur.next;
			cur.next = node;
			cur.next.next = temp;
			cur = cur.next.next;
		}
		// 第二次遍历,填充random节点
		cur = head;
		while (cur != null) {
			Node newNode = cur.next;
			newNode.random = cur.random != null ? cur.random.next : null;
			cur = cur.next.next;
		}
		// 第三次遍历,拆分
		Node headNew = head.next;
		for (Node node = head; node != null; node = node.next) {
			Node nodeNew = node.next;
			node.next = node.next.next;
			nodeNew.next = (nodeNew.next != null) ? nodeNew.next.next : null;
		}
		return headNew;
	}
	class Node {
		int val;
		Node next;
		Node random;
		public Node(int val) {
			this.val = val;
			this.next = null;
			this.random = null;
		}
	}
}

以上就是java算法题解LeetCode35复杂链表的复制实例的详细内容,更多关于java算法复杂链表复制的资料请关注编程网其它相关文章!

--结束END--

本文标题: java算法题解LeetCode35复杂链表的复制实例

本文链接: https://lsjlt.com/news/176840.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java算法题解LeetCode35复杂链表的复制实例
    目录题目示例 1:示例 2:示例 3:示例 4:解题思路题目 AC 剑指 Offer 35. 复杂链表的复制请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中...
    99+
    2023-01-05
    java算法复杂链表复制 java LeetCode
  • Java复杂链表的复制详解
    目录1.题目2.解法2.1 拼接+拆分3.代码1.题目 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,...
    99+
    2024-04-02
  • C语言复杂链表的复制实例详解
    目录一、题目描述示例1:示例2:示例3:示例4:二、思路分析三、整体代码总结一、题目描述 请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一...
    99+
    2024-04-02
  • Java面试题-实现复杂链表的复制代码分享
    阿里终面在线编程题,写出来与大家分享一下        有一个单向链表,每个节点都包含一个random指针,指向本链表中的某个节点或者为空,写一个深度拷贝函数,拷贝整个链...
    99+
    2023-05-31
    java 链表 ava
  • Java复杂链表的示例分析
    这篇文章将为大家详细讲解有关Java复杂链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 ...
    99+
    2023-06-28
  • 怎么理解Java算法复杂度
    本篇内容主要讲解“怎么理解Java算法复杂度”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java算法复杂度”吧!大O符号衡量时间复杂度通常使用”大O符号“。什么是大O符号?我们需要先看...
    99+
    2023-06-02
  • PHP 数组和链表的算法时间复杂度比较
    数组和链表的算法时间复杂度比较:访问数组 o(1),链表 o(n);插入数组 o(1),链表 o(1)/o(n);删除数组 o(1),链表 o(n);搜索数组 o(n),链表 o(n)。...
    99+
    2024-05-07
    php 数组 链表
  • 如何用Java编程实现复杂的算法?
    Java是一种广泛使用的编程语言,具有可移植性和强大的功能。它非常适合用于实现各种复杂算法。在本文中,我们将介绍如何使用Java编写复杂的算法。 一、了解算法 在开始编写复杂的算法之前,我们需要先了解算法的概念。算法是一组逐步执行的操作,用...
    99+
    2023-10-27
    编程算法 javascript shell
  • Java 浅复制和深复制的实例详解
    Java 浅复制和深复制的实例详解1 浅复制和深复制区别浅复制:浅复制只是复制本对象的原始数据类型,如int、float、String,对于数组和对象引用等是不会复制的。因此浅复制是有风险的。深复制:不但对原始数据类型进行复制,对于对象中的...
    99+
    2023-05-31
    java 浅复制 深复制
  • Java算法之时间复杂度和空间复杂度的概念和计算
    目录一、算法效率二、时间复杂度2.1 时间复杂度的概念2.2 大O的渐进表示法2.3 时间复杂度的三种情况2.4 常见时间复杂度计算举例2.4.1 例子2.4.2 冒泡排序时间复杂度...
    99+
    2024-04-02
  • 如何理解算法的复杂度
    本篇内容主要讲解“如何理解算法的复杂度”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解算法的复杂度”吧!1. Motivation - 为什么需要复杂度分...
    99+
    2024-04-02
  • Oracle解析复杂json的方法实例详解
    问题背景:          当前在Oracle数据库(11G之前的版本)解析json没有可以直接使用的系统方法,网上流传的P...
    99+
    2024-04-02
  • Java编程算法:如何实现复杂数据结构?
    Java是一种高级编程语言,它有着强大的编程能力和广泛的应用范围。在Java中,数据结构是编程中最重要的概念之一,因为它能够帮助我们处理和组织数据,从而实现更高效的算法和程序。而对于复杂数据结构的实现,更是Java编程中的重要话题。本文将...
    99+
    2023-07-29
    编程算法 异步编程 path
  • java 中复合机制的实例详解
    java 中复合机制的实例详解继承的缺陷继承的缺陷是由它过于强大的功能所导致的。继承使得子类依赖于超类的实现,从这一点来说,就不符合封装的原则。一旦超类随着版本的发布而有所变化,子类就有可能遭到破坏,即使它的代码完全没有改变。为了说明的更加...
    99+
    2023-05-31
    java 复合 ava
  • 如何在 PHP 中使用 LeetCode 算法解决复杂问题?
    LeetCode 是一个面向程序员的在线评测网站,其主要目的是为程序员提供算法练习和面试准备。 LeetCode 上的算法问题涉及多个主题,涵盖了数据结构、算法和其他计算机科学基本概念。在这篇文章中,我们将讨论如何在 PHP 中使用 Le...
    99+
    2023-08-10
    leetcode windows apache
  • C语言 超详细讲解算法的时间复杂度和空间复杂度
    目录1.前言1.1 什么是数据结构?1.2 什么是算法?2.算法效率2.1 如何衡量一个算法的好坏2.2 算法的复杂度2.3 复杂度在校招中的考察3.时间复杂度3.1 时间复杂度的概...
    99+
    2024-04-02
  • 如何在 Python 编程中利用算法来解决复杂的问题?
    Python 是一种广泛使用的编程语言,具有简单易学、可读性强、功能强大、支持多种编程范式等优点。在 Python 编程中,我们经常需要解决一些复杂的问题,例如排序、查找、最短路径等。这时候,我们可以利用算法来解决这些问题。 本文将介绍一些...
    99+
    2023-07-23
    编程算法 日志 unix
  • 量子计算中的Python珍宝:探寻复杂问题的神奇解法
    1.量子计算中的Python:一个量子编程平台 Python是一种广泛使用的通用编程语言,拥有丰富的库和工具包,这使其成为量子计算的理想选择。借助Python,您可以编写量子算法和应用程序,并与量子硬件进行交互。 2.量子数据类型和操作...
    99+
    2024-02-09
    量子计算, Python, 量子算法, 量子程序, 量子应用
  • avue-crud多级复杂的动态表头的实现示例
    目录前言后台数据拼接前台数据展示页面效果展示Avue.js 是基于现有的element-ui库进行的二次封装,从而简化一些繁琐的操作,核心理念为数据驱动视图,主要的组件库针对tabl...
    99+
    2024-04-02
  • 编程算法:如何使用Python和Bash来解决复杂问题?
    编程算法是计算机科学中非常重要的一个领域,它涉及到如何使用编程语言解决复杂问题。Python和Bash是两种非常强大的编程语言,它们可以用来解决各种各样的问题。在本文中,我们将介绍如何使用Python和Bash来解决复杂问题,并且演示一些...
    99+
    2023-06-24
    bash 编程算法 编程算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作