前段时间在做一个项目,所以没有时间做面试题,最近才将那个科创项目做的差不多了,于是开始做面试题了。

题意:

给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。

返回一个深拷贝的链表。

挑战:

可否使用O(1)的空间

可能是好久没有做面试题了,所以手有点生疏了,这么简单的一道题,做起来都有一点费劲。

1.常规解法(哈希表)

(1).概述

这个题用哈希表解决是非常简单的,理解起来也非常的简单的。

哈希表解法的思路:

第一步,将原链表从头遍历,然后将每个节点深拷贝一份(这里的深拷贝意思:创建一个新的节点,里面的值用原节点的值一样),然后将这个新的节点放入哈希表中,其中key为原节点,value为新的节点;

第二步,从头再遍历原链表,每次遍历从哈希表中取以当前节点为key的新节点,获得新的节点之后,新的节点的next为当前节点的next为key的新节点,新的节点的random也是如此。可能这里看起来有点费劲,不要紧,待会参考代码就会明白了。

(2).代码

public RandomListNode copyRandomList(RandomListNode head) {

HashMap map = new HashMap<>();

RandomListNode p = head;

while (p != null) {

RandomListNode newListNode = new RandomListNode(p.label);

//以当前的原节点为key,新节点为value

map.put(p, newListNode);

p = p.next;

}

p = head;

while (p != null) {

//获取以当前的原节点为key的新节点

RandomListNode q = map.get(p);

//新节点的next

q.next = map.get(p.next);

//新节点的random

q.random = map.get(p.random);

p = p.next;

}

return map.remove(head);

}

2.非常规解法

(1).概述

这种解法主要是为了完成该题的挑战项。

这种解法理解起来相对来说有点难度,其实就是代码的可读性不是很容易,如果理解了方法的思想,代码理解起来就非常的容易。

这里的解释,我用几张图片先来展示一下,其实就是参考了这位大佬的博客:地址

第一步,将每个原节点的next指向对应的节点,这个相对应的节点的next指向原节点的原next。

原来的链表

经过第一步的变换之后

变换之后

第二步,给新节点的random赋值

变换之后

第三步,恢复两个链表的next

恢复之后

(2).代码

public RandomListNode copyRandomList(RandomListNode head) {

if (head == null) {

return null;

}

RandomListNode p = head;

//第一步,将原节点的next指向对应的新节点

//新节点的next指向原节点的原next

while (p != null) {

RandomListNode newP = new RandomListNode(head.label);

newP.next = p.next;

p.next = newP;

p = newP.next;

}

//第二步,参照原节点的random指向,改变新节点的random指向

p = head;

while (p != null) {

//p.next 就是当前节点对应的新节点

p.next.random = p.random == null ? null : p.random.next;

p = p.next.next;

}

//第三步,恢复

RandomListNode newHead = head.next;

p = head;

RandomListNode q = newHead;

while (p != null) {

p.next = q.next;

if (q.next != null) {

q.next = q.next.next;

}

p = p.next;

q = q.next;

}

return newHead;

}

java 链表复制_Java 算法 - 复制带随机指针的链表相关推荐

  1. python 带随机指针的链表深度复制_LeetCode:复制带随机指针的链表

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

  2. M1: 复制带随机指针的链表

    一个链表问题:复制带随机指针的链表 题目:有一个链表L,其每个节点有2个指针,一个指针next指向链表的下个节点,另一个random随机指向链表中的任一个节点,可能是自己或者为空,写一个程序,要求复制 ...

  3. 【刷题日记】3.复制带随机指针的链表

    目录 一.题目介绍 ​编辑 二.题目分析 三.代码实现 题目链接:138. 复制带随机指针的链表 - 力扣(LeetCode) 一.题目介绍 我们最一开始看到题目可能会没有思路,或者压根就不知道如何下 ...

  4. 138. 复制带随机指针的链表 golang

    138. 复制带随机指针的链表 这个题结构体特殊,需要更改上一篇博客的node结构体 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点. 要求返回这个链表的 深 ...

  5. python 带随机指针的链表深度复制_链表--深度拷贝一个带有随机指针的链表

    链表--深度拷贝一个带有随机指针的链表 链表--深度拷贝一个带有随机指针的链表 本文介绍两种解法. 解法1:利用一个map ListNode *copyRandomList(ListNode *hea ...

  6. 【力扣】复制带随机指针的链表题解 C语言实现

    前言 这是力扣里的一道经典链表题,据说掌握此题你对链表的理解能力就是优秀水平了 题目 /*** Definition for a Node.* struct Node {* int val;* str ...

  7. 【数据结构与算法】之深入解析“复制带随机指针的链表”的求解思路与算法示例

    一.题目 ① 题目描述 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点. 构造这个链表的深拷贝,深拷贝应该正好由 n 个全新节点 ...

  8. leetcode算法题--复制带随机指针的链表★

    原题链接: https://leetcode-cn.com/problems/copy-list-with-random-pointer/ https://leetcode-cn.com/proble ...

  9. [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. 微信小程序发送验证码60秒倒计时
  2. gentoo.tw的临时解决方法[转贴]
  3. Easyexcel文件下载时,中文名称显示为下划线
  4. Reversing Ethereum Smart Contracts: Part 2
  5. SAP Spartacus的StorefrontConfig对象
  6. CentOS7安装go开发环境
  7. 骑行318、 2016.7.14
  8. [转]Stream 和 byte[] 之间的转换
  9. matlab 自动交易系统设计2
  10. 三角波fft的c语言程序设计,dsp的fft实现设计报告.docx
  11. Max Script|修改器篇
  12. Labelling tools 的环境配置
  13. The Journal of Neuroscience: 珠心算训练有助于提高儿童的视觉空间工作记忆
  14. 最强大脑记忆曲线(4)——关于项目中的全局变量
  15. ssdt函数索引号_BUG:SSDT函数名获取SSDT函数号
  16. 【基础】《操作系统》学习笔记(B站王道考研)(1)
  17. 转载:使用飞信VMDotNet使C#程序脱离.NET FRAMEWORK也能运行的一些心得
  18. 怎么找电脑服务器文档,电脑服务器地址怎么找
  19. 北京市法官去年人均结案357件 居内地首位
  20. Octotree 神器 tips

热门文章

  1. 步进电机 步距角 编码器_我如何迈出了学习编码的第一步
  2. 步进电机步距角精度是什么?
  3. layer.open属性详解 layui弹出层
  4. 韩央行:英国脱欧协议被否决对金融市场影响有限
  5. 富士康员工的逆袭之路,从月薪4K到现在月入1W+,是如何做到的?
  6. 一个优秀妹子的后台面试经验,含泪总结...
  7. Linux -- vim编辑器使用教程
  8. Device overview
  9. CSS中cursor的属性hander和pointer
  10. 使用pre-signed URLs通过浏览器上传 无中间件前端直传 minio