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

 更新时间:2023年01月05日 11:12:43   作者:itbird01  
这篇文章主要为大家介绍了java算法题解LeetCode35复杂链表的复制实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目

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算法复杂链表复制的资料请关注脚本之家其它相关文章!

相关文章

  • Spring Boot整合Bootstrap的超详细步骤

    Spring Boot整合Bootstrap的超详细步骤

    之前做前端开发,在使用bootstrap的时候都是去官网下载,然后放到项目中,在页面引用,下面这篇文章主要给大家介绍了关于Spring Boot整合Bootstrap的超详细步骤,需要的朋友可以参考下
    2023-05-05
  • 软件开发七大过程模型

    软件开发七大过程模型

    这篇文章主要介绍了Java七大过程模型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • Java将微信和支付宝支付的个二维码合二为一的方法

    Java将微信和支付宝支付的个二维码合二为一的方法

    这篇文章主要介绍了Java将微信和支付宝支付的个二维码合二为一的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • intellij idea查看方法被哪些类引用过(推荐)

    intellij idea查看方法被哪些类引用过(推荐)

    这篇文章主要介绍了intellij idea查看方法被哪些类引用过,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java中的输出格式化问题小结

    Java中的输出格式化问题小结

    在Java中,System.out.printf方法用于格式化输出,格式化字符串`%.6f`表示浮点数保留6位小数,其他格式化选项包括`%d`(整数)、`%s`(字符串)和`%e`(科学计数法),示例代码展示了如何使用这些格式化选项,感兴趣的朋友一起看看吧
    2025-02-02
  • java传入时间戳返回LocalDateTime的实现方法

    java传入时间戳返回LocalDateTime的实现方法

    这篇文章主要介绍了java传入时间戳返回LocalDateTime的实现方法,在Java中将时间戳转换为LocalDateTime时需要注意时区问题,因为LocalDateTime不包含时区信息,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-11-11
  • java存储以及java对象创建的流程(详解)

    java存储以及java对象创建的流程(详解)

    下面小编就为大家带来一篇java存储以及java对象创建的流程(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java反射和动态代理的使用解读

    Java反射和动态代理的使用解读

    这篇文章主要介绍了Java反射和动态代理的概念、使用方法和应用场景,反射允许在运行时动态地获取类的信息和调用类的方法,而动态代理则可以在不修改原有代码的情况下,为方法调用添加额外的功能
    2025-02-02
  • 使用sharding-jdbc实现水平分表的示例代码

    使用sharding-jdbc实现水平分表的示例代码

    本文主要介绍了sharding-jdbc实现水平分表,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java Servlet中Response对象的使用方法

    Java Servlet中Response对象的使用方法

    本文介绍了Java Servlet中Response对象的使用方法,包括设置响应头、设置响应编码、向客户端发送数据、重定向等操作,同时介绍了常用的响应状态码和响应类型,帮助读者更好地理解和掌握Servlet中Response对象的用法
    2023-05-05

最新评论