当前位置: 首页 > news >正文

leetcode138.随机链表的复制

在这里插入图片描述

随机链表的复制

  • 问题分析
    • 1. 复制节点并插入到原节点后面:
    • 2. 复制随机指针:
    • 3. 分离原链表和新链表:
  • 代码实现
    • 1. 初始化指针和变量:
    • 2. 复制节点:
    • 3. 复制随机指针:
    • 4. 分离链表:
    • 5. 返回新链表的头节点:

在这里插入图片描述

随机链表的复制
在这里插入图片描述

问题分析

链表中的每个节点包含三个属性:val(节点的值),next(指向下一个节点的指针),以及random(一个随机指针,可以指向链表中的任意节点,或者为NULL)。我们的目标是创建一个新的链表,其中每个节点的值与原链表中相应节点的值相同,并且新链表中的next和random指针也正确地指向新链表中的节点。

算法分为三个主要步骤:

1. 复制节点并插入到原节点后面:

◦ 遍历原链表,为每个节点创建一个副本,并将副本插入到原节点的后面。
◦ 这一步确保了每个原节点和其副本节点相邻,便于后续设置next和random指针。

2. 复制随机指针:

◦ 再次遍历链表,这次是为了复制每个副本节点的random指针。
◦ 由于副本节点紧跟在原节点之后,原节点的random指针指向的节点的下一个节点就是副本节点的random指针应该指向的节点。

3. 分离原链表和新链表:

◦ 遍历链表,将每个副本节点从原链表中分离出来,形成一个新的链表。
◦ 使用尾插法构建新链表,这样可以避免在构建新链表时破坏原链表的结构。

代码实现

代码实现遵循上述算法设计,具体步骤如下:

1. 初始化指针和变量:

◦ 使用cur指针遍历原链表。
◦ 使用copyHead和copyTail指针来构建和维护新链表。

2. 复制节点:

◦ 为每个节点创建副本,并将其插入到原节点之后。
◦ 更新cur指针以继续遍历。

3. 复制随机指针:

◦ 再次遍历链表,为每个副本节点设置random指针。
◦ 更新cur指针以继续遍历。

4. 分离链表:

◦ 遍历链表,将副本节点从原链表中分离出来,并构建新链表。
◦ 使用尾插法将副本节点添加到新链表中。

5. 返回新链表的头节点:

◦ 返回copyHead,即新链表的头节点

class
 Solution {
public
:
    Node* copyRandomList(Node* head) {
        // 1.拷贝链表,并插入到原节点的后面
        Node* cur = head;
        while(cur)
        {
            Node* next = cur->next;

            Node* copy = (Node*)malloc(sizeof(Node));
            copy->val = cur->val;

            // 插入
            cur->next = copy;
            copy->next = next;

            // 迭代往下走
            cur = next;
        }

        // 2.置拷贝节点的random
        cur = head;
        while(cur)
        {
            Node* copy = cur->next;
            if(cur->random != NULL)
                copy->random = cur->random->next;
            else
                copy->random = NULL;

            cur = copy->next;        }

        // 3.解拷贝节点,链接拷贝节点
        Node* copyHead = NULL, *copyTail = NULL;
                cur = head;
        while(cur)
        {
            Node* copy = cur->next;
            Node* next = copy->next;

            // copy解下来尾插
            if(copyTail == NULL)
            {
                copyHead = copyTail = copy;
            }
            else
            {   
                copyTail->next = copy;
                copyTail = copy;
            }

            cur->next = next;

            cur = next;
        }

        return copyHead;
    }
};

相关文章:

  • 通配符(Wildcard)
  • 很简单 的 将字幕生成视频的 方法
  • Ansible playbook-ansible剧本
  • Linux中的系统管理和优化
  • 人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!
  • AISEO (GEO )中的知识图谱
  • List中多个数据相同,保留最新日期数据
  • 设计模式 三、结构型设计模式
  • 【夜话系列】DelayQueue延迟队列(下):实战应用与面试精讲
  • 51. “闲转易”交易平台小程序(基于springbootvue)
  • 两个有序序列的合并-手摇算法
  • 【深度学习新浪潮】Grok过去两周的进展一览(2025.04.01)
  • [学成在线]09-课程预览
  • 论文阅读笔记:Denoising Diffusion Implicit Models (2)
  • Spring Boot 快速入手
  • node.js、npm相关知识
  • Redis 在 Linux 系统的安装指南
  • 【Docker项目实战】使用Docker部署NoteFlow笔记工具
  • 本地RAG知识库,如何进行数据结构化和清洗?
  • 在 Vue2 项目中配置自定义属性并在组件中使用,可按以下步骤进行:
  • 北约年度报告渲染所谓“中国核威胁”,国防部回应
  • 印巴冲突升级,巴防长称已击落5架印度战机
  • 鸿蒙概念股强势上涨,鸿蒙电脑本月正式发布,生态链即将补全
  • 综合治理食品添加剂滥用问题,国务院食安办等六部门联合出手
  • AI世界的年轻人|“热潮下要有定力”,她的目标是让机器人真正步入家庭
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答记者问