复杂链表的复制(C语言)

embedded/2024/10/18 8:31:41/

题目

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
在这里插入图片描述

算法原理

我们很容易能够根据next创建一个原链表的顺序链表,但是如何把random的指针指向正确的位置呢?我们很容易想到遍历的方法,如图所示:13的random指向7,那么我们只要遍历当结点的值满足7,再把13的random指向7就可以了,但是如果有两个结点的值是相同的这个方法就行不通了,而且这个方法的时间复杂度是O(n^2)。
这里我们介绍的方法是:建立原结点和拷贝结点之间的关系
1.拷贝结点值到原结点后面
在这里插入图片描述

2.控制拷贝结点的random:拷贝结点的random是原结点random->next
3.拷贝节点离开原结点,恢复原链表

代码实现

struct Node { int val;          // 定义节点的值struct Node* next;  // 指向下一个节点的指针struct Node* random; // 指向随机节点的指针
};struct Node* copyRandomList(struct Node* head) { // 定义一个当前节点的指针 cur,初始化为头节点 headstruct Node* cur = head; while (cur) { // 为新节点分配内存struct Node* copy = (struct Node*)malloc(sizeof(struct Node)); // 将当前节点的值复制到新节点中copy->val = cur->val; // 获取当前节点的下一个节点struct Node* next = cur->next; // 将当前节点的下一个指针指向新复制的节点cur->next = copy; // 新复制节点的下一个指针指向原来的下一个节点copy->next = next; // 移动到下一个节点cur = next;// 控制拷贝节点的 randomcur = head; while (cur) { // 获取当前节点的下一个节点struct Node* copy = cur->next; // 判断当前节点的 random 是否为空if (cur->random == NULL) {  // 这里将 = 改为 ==// 如果为空,将新节点的 random 设置为 NULLcopy->random = NULL; } else { // 否则,将新节点的 random 设置为当前节点的 random 的下一个节点copy->random = cur->random->next; } // 移动到下一个节点cur = copy->next; } // 用于保存拷贝后链表的头节点struct Node* copyHead = NULL; // 用于保存拷贝后链表的尾节点struct Node* copyTail = NULL; while (cur) { // 获取当前节点的下一个节点struct Node* copy = cur->next; // 获取下一个节点struct Node* next = copy->next; // 如果尾节点为 NULLif (copyTail == NULL) { // 将头节点设置为当前节点copyHead = copyTail = copy; } else { // 将尾节点的下一个节点设置为当前节点copyTail->next = copy; // 更新尾节点为当前节点copyTail = copyTail->next; // 将当前节点的下一个节点设置为下一个节点cur->next = next; // 移动到下一个节点cur = next; } // 返回拷贝后链表的头节点return copyHead; } 
}

http://www.ppmy.cn/embedded/16353.html

相关文章

云LIS系统概述JavaScript+前端框架JQuery+EasyUI+Bootstrap医院云HIS系统源码 开箱即用

云LIS系统概述JavaScript前端框架JQueryEasyUIBootstrap医院云HIS系统源码 开箱即用 云LIS(云实验室信息管理系统)是一种结合了计算机网络化信息系统的技术,它无缝嵌入到云HIS(医院信息系统)中,用于连…

仿redis的zset类型

前言 模仿redis的zset数据类型,写了Java内存版,写这个的背景是做自己的小项目,服务器资源有限,不想引入redis,但同时又想使用zset的排序功能,所以就自己写了一个简化版本。 package com.fjding.exam.utils…

Linux使用Docker部署DashDot访问本地服务器面板

文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2. 部署DashDot应用 本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘,并且结合cpolar内网穿透工具可以实现公网实时监测服务器系统、处理器、内存、存储、网络、显卡等,并且拥有API接…

Transformer step by step--Positional Embedding 和 Word Embedding

Transformer step by step往期文章: Transformer step by step--层归一化和批量归一化 要把Transformer中的Embedding说清楚,那就要说清楚Positional Embedding和Word Embedding。至于为什么有这两个Embedding,我们不妨看一眼Transformer的…

COOIS 生产订单显示系统增强

需求说明:订单系统显示页面新增批量打印功能 增强点:CL_COIS_DISP_LIST_NAVIGATION -->TOOLBAR方法中新增隐式增强添加自定义打印按钮 增强点:BADI-->WORKORDER_INFOSYSTEM新增增强实施 实现位置:IF_EX_WORKORDER_INFOSYS…

2024年vue 开发环境 Node.js于win10环境下的安装

2024年vue 开发环境 Node.js于win10环境下的安装 导航 文章目录 2024年vue 开发环境 Node.js于win10环境下的安装导航一、下载node.js二、安装node.js三、测试(一)四、环境配置五、测试(二)六、安装淘宝镜像七、安装vue脚手架 一、下载node.js Node.js 官方网站下载&#xff…

Stable Diffusion中的embedding

Stable Diffusion中的embedding 嵌入,也称为文本反转,是在 Stable Diffusion 中控制图像样式的另一种方法。在这篇文章中,我们将学习什么是嵌入,在哪里可以找到它们,以及如何使用它们。 什么是嵌入embedding&#xf…

【鸿蒙应用】理财App

目录 第一节项目讲解项目介绍 第二节:项目创建登录静态框架编写登录页面设稿新建项目控制台添加项目Login页面封装标题组件 第三节:登录页静态表单编写第四节—内容页架构分析底部栏组件第五节—底部栏组件切换第六节:首页静态页编写第七节&a…