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

news/2024/9/24 7:48:50/

题目

请实现 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/news/1437374.html

相关文章

【CSS】使用 scroll snap 实现页面的垂直大屏滚动

CSS 属性 scroll-snap-type 设置了在有滚动容器的情形下吸附至吸附点的严格程度。 scroll-snap-type 使用 scroll snap 也可以用于垂直滚动&#xff0c;全屏展示就是一个很好的例子: <main><section class"section section-1"></section><sect…

无人机+自组网:2U机架车载式自组网电台技术详解

自组网的特点包括自发现、自动配置、自组织和自愈等。由于网络中的节点可以随时加入或离开&#xff0c;自组网需要能够自动感知拓扑结构的变化&#xff0c;并快速调整路由策略以适应新的网络环境。此外&#xff0c;自组网中的节点还需要具备节能、安全和分布式管理等特性&#…

java项目:微信小程序基于SSM框架实现的购物系统小程序【源码+数据库+毕业论文+PPT】

一、项目简介 本项目是一套基于SSM框架实现的购物系统小程序 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐…

自己搭建的大疆无人机RTMP流媒体服务延迟太大

流程&#xff1a;无人机摄像头->图传->遥控器->流媒体服务器->取流播放&#xff0c;延迟有10秒来的&#xff0c;大家有没有什么好的方案。

鸿蒙APP开发页面组件之间的属性关系

我们将对于多页面以及更多有趣的功能展开叙述&#xff0c;这次我们对于 HarmonyOS 的很多有趣常用组件并引出一些其他概念以及解决方案、页面跳转传值、生命周期、启动模式&#xff08;UiAbility&#xff09;&#xff0c;样式的书写、状态管理以及动画等方面进行探讨 页面之间…

【STM32+HAL+Proteus】系列学习教程---ADC(查询、中断、DMA模式下的电压采集)

实现目标 1、学会STM32CubeMX软件关于ADC的配置 2、掌握ADC三种模式&#xff08;查询、中断、DMA&#xff09;编程 3、具体目标&#xff1a;1、将开发板单片机采集到的电压值上传至上位机串口调试助手显示。 一、ADC 概述 1、什么是ADC? ADC&#xff08;Analog to Digit…

SSH远程直连服务器docker容器的jupyter

SSH远程直连服务器docker容器的jupyter 动机&#xff1a;最近在公司服务器使用jupyter出现了点问题&#xff0c;也不知道怎么回事&#xff0c;jupyter lab打开都没问题&#xff0c;但是准备打开一个ipynb文件时就卡住了&#xff0c;啥反应没有&#xff0c;ctrlC 也不能关掉jupy…

异地组网的供应商信息?

在当前信息时代&#xff0c;许多企业或个人需要跨地域进行网络连接&#xff0c;实现异地组网。异地组网是指通过网络技术将不同地区的计算机或网络设备连接起来&#xff0c;实现信息共享和远程访问的功能。本文将介绍一家供应商【天联】在异地组网领域的优势和相关服务。 【天联…