算法的学习笔记—复杂链表的复制(牛客JZ35)

news2024/9/26 3:28:42

img

😀前言
在许多实际应用中,我们会遇到复杂链表的复制问题。复杂链表不同于一般的单链表,不仅每个节点有指向下一个节点的指针,还有一个特殊的指针 random,可以指向链表中的任意节点或 null。如何高效地复制这样一个复杂链表是一个常见的面试题。本文将详细解析这一问题,并提供一个Java实现。

🏠个人主页:尘觉主页

文章目录

  • 复杂链表的复制
    • 问题描述
    • 解题思路
    • Java代码实现
      • 代码解析
      • 关键点解析
    • 😄总结

复杂链表的复制

NowCoder

问题描述

给定一个复杂链表,其中每个节点包含一个整型值 label,一个指向下一个节点的指针 next,以及一个指向链表中任意节点的特殊指针 random。我们的任务是返回这个链表的深拷贝,即创建一个新的链表,其结构和原始链表完全相同,但各节点是独立的。

public class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}

image-20240823184355656

如上图所示,每个节点有两个指针,一个指向下一个节点,另一个随机指向链表中的任意节点或 null

解题思路

为了高效地复制这个复杂链表,可以分为三个主要步骤:

  1. 插入复制节点:在每个原节点的后面插入一个新的复制节点。新节点的 label 和原节点相同,next 指针指向原节点的下一个节点,而原节点的 next 指针则指向这个新插入的复制节点。

dfd5d3f8-673c-486b-8ecf-d2082107b67b

  1. 建立 random 链接:在完成复制节点的插入后,遍历链表,为每个复制节点设置 random 指针,使其指向原节点 random 指针指向的节点的下一个节点。

cafbfeb8-7dfe-4c0a-a3c9-750eeb824068

  1. 拆分链表:最后,将链表拆分为两个独立的链表,一个是原始链表,另一个是复制链表。我们要确保原链表和复制链表的结构和指针完全独立。

e151b5df-5390-4365-b66e-b130cd253c12

Java代码实现

以下是实现这个算法的Java代码,并附有详细的注释解释每一步的操作。

public class Solution {

    /**
     * 复制复杂链表
     * @param pHead 原链表的头节点
     * @return 复制链表的头节点
     */
    public RandomListNode Clone(RandomListNode pHead) {
        if (pHead == null) {
            return null;  // 如果原链表为空,直接返回null
        }

        // 第一步:在每个节点后面插入复制的节点
        RandomListNode cur = pHead;
        while (cur != null) {
            RandomListNode clone = new RandomListNode(cur.label);  // 创建新节点
            clone.next = cur.next;  // 复制节点的next指向原节点的下一个节点
            cur.next = clone;  // 原节点的next指向复制节点
            cur = clone.next;  // 移动到下一个原节点
        }

        // 第二步:为复制节点建立 random 链接
        cur = pHead;  // 重置指针到链表头
        while (cur != null) {
            RandomListNode clone = cur.next;  // 获取复制节点
            if (cur.random != null) {
                clone.random = cur.random.next;  // 复制节点的random指向原节点的random的下一个节点
            }
            cur = clone.next;  // 移动到下一个原节点
        }

        // 第三步:拆分链表,将复制节点从原链表中分离出来
        cur = pHead;  // 重置指针到链表头
        RandomListNode pCloneHead = pHead.next;  // 记录复制链表的头节点
        while (cur.next != null) {
            RandomListNode next = cur.next;  // 获取当前节点的下一个节点
            cur.next = next.next;  // 将当前节点的next指针指向下一个原节点
            cur = next;  // 移动到下一个节点
        }

        return pCloneHead;  // 返回复制链表的头节点
    }
}

代码解析

  • 插入复制节点
    • 首先,遍历原始链表,对于每个节点,创建一个新节点,将其插入到当前节点与下一个节点之间。
  • 建立 random 链接
    • 再次遍历链表,为每个复制节点设置 random 指针,指向原节点 random 所指向的节点的下一个节点。
  • 拆分链表
    • 最后一步,将原链表和复制链表分离。原链表恢复原样,而复制链表则成为一个独立的链表。

关键点解析

  • 时间复杂度
    • 整个过程只需遍历链表三次,时间复杂度为 O(N),其中 N 是链表节点的数量。
  • 空间复杂度
    • 由于使用的是原地算法,没有额外的空间开销,空间复杂度为 O(1)。

😄总结

本文介绍了一种高效的算法来解决复杂链表的复制问题。通过在原链表中插入复制节点、建立 random 链接、以及最后的拆分操作,我们可以在O(N)的时间复杂度内完成链表的深拷贝。这种方法不仅简洁高效,而且避免了使用额外的数据结构,是面试中的经典题目之一。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067397.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CACTER直播预告:聚焦EDLP邮件数据防泄露实战重点

在信息高速流通的今天,邮件作为商务沟通的桥梁,不仅承载着日常沟通,更是企业机密和知识产权的重要载体。然而,邮件系统的开放性也使其成为网络攻击的主要目标。数据泄露不仅会导致商业损失,还可能对企业声誉造成不可逆…

【请安全下载】黑神话:悟空 单机游戏 它是如何保证安全的 怎样防破解的?安全措施:D加密,反外挂,代码加密,资源保护

单机 《黑神话:悟空》是一款单机游戏,由游戏科学开发,并于2024年8月20日全球同步上线。游戏以其独特的暗黑国风、深度的故事背景以及精致的游戏画面,重塑了西游题材,为玩家呈现了一个前所未有的悟空传奇。 黑神话&…

[Linux]在Ubuntu中安装samba并且正确配置(详细)

一、我们为什么需要samba服务 samba是一种实现windows和linux包括macos文件共享的套件。它能让我们像访问自己的磁盘一样去访问别的系统的文件。可以看得出来这种一种快速并且高效的文件传输协议。看到这里,大家可能会有些疑问。向linux传输文件,我们可以…

常用网络测试工具以及解决tcp协议带来得问题

一、解决粘包问题 1.1、tcp的特点 面向字节流特点,会造成可能数据与数据发送到一块,成为粘包,数据之间不区分 1.2、拆包 因为缓冲区的大小,一次性发送的数据会进行拆分(大小不符合的时候) 就和水一样一…

vue3使用i18n实现国际化

安装vue-i18n npm install vue-i18n创建一个ts文件用于存储各种翻译 globalLang.ts的内容如下: export default {"cn": {},"en": {},"de": {},"es": {},"fr": {},"id": {},"it": {},&quo…

HDMI画面发白

这个问题困扰我很久了,今天在抖音上看到了解决方案! https://v.douyin.com/Ceie2g2s/ 量化范围:有限范围改成全范围。

Tomcat安装部署

简介 Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说,Tomcat是一个WEB应用程序的托管平台&…

关于elementui table组件 —— 竖向表格

前端模拟数据方式&#xff1a; html代码&#x1f447;&#xff1a; <template><el-table :data"tableData" style"width: 60%;margin-top:20px" stripe :show-header"false" border :row-style"rowStyle"><el-table…

培训第三十五天(容器的基础命令使用)

1、创建一个容器并同时执行echo命令 # 快速启动一个容器执行特定的一次性命令并查看输出结果&#xff0c;输出结果后容器直接退出[rootdocker ~]# docker run -it --namea0 centos:latest echo "abc"abc[rootdocker ~]# docker psCONTAINER ID IMAGE COMMAND …

FreeRTOS 快速入门(六)之互斥量

目录 一、互斥量1、基本概念2、运作机制3、死锁现象4、递归互斥量 二、优先级反转和优先级继承问题1、优先级反转问题2、优先级继承问题 三、互斥量函数1、互斥量1、创建 2、获取互斥量3、释放互斥量4、删除互斥量 一、互斥量 1、基本概念 互斥量又称互斥信号量&#xff08;本…

Vue.js学习笔记(七)使用sortablejs或el-table-draggable拖拽ElementUI的el-table表格组件

文章目录 前言一、el-table-draggable是什么&#xff1f;二、使用步骤1.安装使用2.sortablejs 总结 前言 记录 el-table-draggable 插件使用方法。 一、el-table-draggable是什么&#xff1f; el-table-draggable的存在就是为了让vue-draggable支持element-ui中的el-table组件…

Lesson 81+82 Roast beef and potatoes

Lesson 8182 Roast beef and potatoes 词汇 bath n. 洗澡&#xff0c;浴缸 搭配&#xff1a;have a bath 泡澡 相关&#xff1a;take a shower 淋浴&#xff0c;冲个澡    shower&#xff1a;花洒&#xff0c;喷头 例句&#xff1a;Bobby总是在傍晚洗澡。    Bobby alw…

基于预训练模型,进行氨基酸序列编码,用于深度学习模型构建

本团队提供生物医学领域专业的AI&#xff08;机器学习、深度学习&#xff09;技术支持服务。如果您有需求&#xff0c;请扫描文末二维码关注我们。 在对氨基酸序列数据进行深度学习模型构建时&#xff0c;首先需要将字符形式的序列数据进行编码操作。最简单的当然是One-hot编码…

【Java】/* 双向链式队列 和 循环队列 - 底层实现 */

一、链式队列 1. 使用双向链表实现队列&#xff0c;可以采用尾入&#xff0c;头出 也可以采用 头入、尾出 (LinkedList采用尾入、头出) 2. 下面代码实现的是尾入、头出&#xff1a; package bageight;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: …

[kaggle竞赛] 毒蘑菇的二元预测

毒蘑菇的二元预测 您提供了很多关于不同二元分类任务的资源和链接&#xff0c;看起来这些都是Kaggle竞赛中的参考资料和高分解决方案。为了帮助您更好地利用这些资源&#xff0c;这里是一些关键点的总结&#xff1a; Playground Season 4 Episode 8 主要关注的竞赛: 使用银行…

2024/8/22 英语每日一段

Belgian triathlete Claire Michel ultimately said it was a virus and not bacteria from the water that made her sick after a swim. But Belgium’s Olympic committee said in a statement that it hoped “lessons will be learned” for future Olympics. “We are th…

鸿蒙(API 12 Beta3版)【使用ImageEffect编辑图片】图片开发指导

场景介绍 ImageEffect提供了一系列接口用于图像的编辑。开发者可以通过ImageEffect接口处理不同图像输入类型Pixelmap、NativeWindow、NativeBuffer或Uri&#xff0c;获得滤镜处理效果。 针对ImageEffect&#xff0c;常见的开发场景如下&#xff1a; 通过ImageEffect提供的N…

iOS 18 Beta 7测试版本体验,无新功能,修复已知bug

近日苹果公司发布了iOS 18 beta7版本&#xff0c;版本号22A5346a。那iOS 18beta7版本是否比其他的测试版要更好用呢&#xff1f;以下测试结果仅供果粉参考&#xff0c;一机一况&#xff0c;以个人实际体验为准。 一、日常使用体验 1、App响应非常快&#xff0c;动画过渡时间稍…

【高等代数笔记】线性方程组的解法(三、四、五)

1. 线性方程组的解法 由于这个视频课的分p十分抽象&#xff0c;我还是把一节完整的课学完再发表笔记吧&#xff0c;要不然太零碎了。 接上一篇文章 阶梯形方程组为 { x 1 − x 2 2 x 3 − 1 0 0 \left\{\begin{array}{l} x_{1}-x_{2}2 \\ x_{3}-1 \\ 00 \end{array}\righ…

dll错误修复工具:一键解决系统DLL错误产生的程序问题(新手入门)

dll错误修复工具&#xff0c;主要解决导致Windows系统上程序出错的各种dll相关问题。金舟DirectXDLL一键修复提供了全面的且快速的扫描功能&#xff0c;能够检测出导致程序故障的任何dll错误&#xff0c;并且一键进行修复。 一、什么是dll文件 dll是系统的动态链接库文件&…