【数据结构算法经典题目刨析(c语言)】随机链表的复制(图文详解)

news2025/1/13 15:51:39

💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:数据结构经典题目刨析(c语言)

目录

一、题目描述

二、思路分析 

三、代码实现 


 

一、题目描述

二、思路分析 

要完成一个带随机指针的链表的复制,有一个巧妙的办法:分三步走

1.完成节点数据拷贝——在原链表的每个节点后面增加一个拷贝节点,拷贝节点的值等于原节点的值
2.完成节点的随机指针拷贝——原节点的随机指针指向哪里,拷贝节点就指向对应节点的下一个节点(这一部分是这条思路能实现的关键)
3.完成节点的next指针拷贝——将拷贝节点从原链表中取下,按顺序改变next指针指向,组成新的链表,并恢复原链表的next指针(也可不恢复)

 

1. 原链表中节点的数据拷贝 

  • 创建pcur指针指向链表第一个节点,遍历链表
  • 在每个节点后面创建一个相同结构的拷贝节点,拷贝原节点数据
  • 修改链表next指针指向如下:
  • 原链表节点->该节点拷贝节点->原链表下一个节点->该节点拷贝节点……原链表最后一个节点->该节点拷贝节点->NULL

 经过第一轮循环后,原链表每个节点之后被插入了一个新节点

 

这一部分的实现代码如下 

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) 
{
    Node* pcur=head;
    while(pcur)
    {
        Node*copy=(Node*)malloc(sizeof(Node));//创建拷贝节点
        copy->val=pcur->val;//拷贝数据
 
        copy->next=pcur->next;//插入到pcur后面
        pcur->next=copy;
 
        pcur=copy->next;//移动pcur指针
    }
}

2.原链表中节点的随机指针拷贝 

1.pcur指针重新指向第一个节点,重新遍历链表
进入循环
2.拷贝指针指向pcur的下一个节点
3.如果pcur指针指向节点的随机指针指向NULL,拷贝节点的随机指针则相同
否则拷贝节点的随即指针指向pcur的随机指针的下一个节点

 

 

这一部分实现代码如下

pcur=head;//指针重置
    while(pcur)//链表随机指针拷贝
    {
        Node*copy=pcur->next;
        if(pcur->random==NULL)
            copy->random=NULL;//对指向NULL的情况额外处理
        else
        {
            copy->random=pcur->random->next;//随机指针拷贝的关键
        }
        pcur=copy->next;
    }

3.原链表中节点的next指针拷贝,拷贝节点成为单独的新链表  

1.pcur指针重新指向链表第一个节点
2.创建新链表的头指针和尾指针初始都指向空
3.进入循环——拷贝指针指向pcur的下一个节点
next指针指向拷贝指针的下一个节点
接下来将拷贝节点尾插到新链表,并恢复原链表
如果新链表为空,则新链表首尾指针都指向拷贝节点
否则,新链表尾指针的next指向拷贝节点,然后尾指针指向拷贝节点
再将pcur指针指向节点的next指向next指针对应的节点
循环直到pcur走向NULL

这一部分的实现代码如下(并恢复的代码)

pcur=head;
    Node*newhead=NULL,*newtail=NULL;
    while(pcur)
    {
        Node*copy=pcur->next;//指向要拷贝的节点
        Node*next=copy->next;//指向原链表原本的下一个节点
 
        if(newhead==NULL)//将拷贝节点尾插到新链表上
        {
            newhead=newtail=copy;
        }
        else
        {
            newtail->next=copy;
            newtail=copy;
        }
 
        pcur->next=next;//恢复原链表
        pcur=next;
    }
    return newhead;

不恢复的代码 

pcur=head->next;
        struct Node*newhead=NULL;
        struct Node*newtail=NULL;
        newhead=newtail=head->next;
        while(pcur->next)
        {
        pcur=pcur->next->next;
        newtail->next=pcur;
        newtail=pcur;
        }

        newtail->next=NULL;
        return newhead; 

三、代码实现 

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) 
{
    Node* pcur=head;
    while(pcur)//链表数据拷贝
    {
        Node*copy=(Node*)malloc(sizeof(Node));//创建拷贝节点
        copy->val=pcur->val;//拷贝数据
 
        copy->next=pcur->next;//插入到pcur后面
        pcur->next=copy;
 
        pcur=copy->next;//移动pcur指针
    }
 
 
    pcur=head;//指针重置
    while(pcur)//链表随机指针拷贝
    {
        Node*copy=pcur->next;
        if(pcur->random==NULL)
            copy->random=NULL;//对指向NULL的情况额外处理
        else
        {
            copy->random=pcur->random->next;//随机指针拷贝的关键
        }
        pcur=copy->next;
    }
 
    pcur=head;
    Node*newhead=NULL,*newtail=NULL;
    while(pcur)
    {
        Node*copy=pcur->next;//指向要拷贝的节点
        Node*next=copy->next;//指向原链表原本的下一个节点
 
        if(newhead==NULL)//将拷贝节点尾插到新链表上
        {
            newhead=newtail=copy;
        }
        else
        {
            newtail->next=copy;
            newtail=copy;
        }
 
        pcur->next=next;//恢复原链表
        pcur=next;
    }
    return newhead;
}

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

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

相关文章

钉耙编程(3)

1001深度自同构 Problem Description 对于无向图中的点,定义一个点的度为与其相连的边的条数。 对于一棵有根树,定义一个点的深度为该点到根的距离。 对于由若干有根树构成的森林,定义该森林是深度自同构的,当且仅当森林中任意…

[Java]基础语法

注释 注释就是程序中对代码进行解释说明的文字 生效范围: 注释不影响程序执行, 因为运行的字节码文件中不保留注释 字面量 数据在程序中的书写格式称为字面量 变量 在内存中开辟一块区域, 用来存储数据, 这块空间称为变量 定义变量 使用变量 变量的优势 便于数据的扩展和…

【LeetCode每日一题】搜索旋转排序数组

分析 二分 以4 5 6 7 0 1 2为例,发现将数组分割成两半后,总存在一边是有序 ,有序的那一部分可以使用二分 4|5 6 7 0 1 2 4 5|6 7 0 1 2 4 5 6|7 0 1 2 4 5 6 7|0 1 2 4 5 6 7 0|1 2 4 5 6 7 0 1|2分为三种情况 因为没有重复元素&#xff0…

RAGflow:开源AI框架的创新与应用

在当今科技飞速发展的时代,人工智能(AI)已经成为各行各业不可或缺的一部分。特别是在文档处理和数据分析领域,AI的应用更是无处不在。今天,我要向大家介绍一个开源的AI框架引擎——RAGflow。它能够在深度文档理解方面执…

情感推理在医疗领域的应用

关键词:情感推理、情感分类、多模态大模型、语音识别、思维链 医疗领域中人工智能(AI)的决策透明度至关重要,因为错误可能带来严重后果。这种透明度有助于建立AI与用户之间的信任。情感分析是自然语言处理(NLP&am…

【通俗理解】马尔科夫毯:信息屏障与状态独立性的守护者

【通俗理解】马尔科夫毯:信息屏障与状态独立性的守护者 马尔科夫毯的通俗比喻 你可以把马尔科夫毯想象成一个“信息屏障”,它隔绝了系统内部与外部的信息交流。在这个屏障之内,系统的状态是独立的,不受外界影响。 马尔科夫毯的核心…

【Kylin使用心得的介绍】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 👻Kylin 👻Kylin是一款Linux发行版,由中国国内的开发者团队…

Web开发:小结Apache Echarts官网上常用的配置项(前端可视化图表)

目录 一、须知 二、Title 三、 Legend 四、Grid 一、须知 配置项官方文档:点此进入。 我总结了比较常用的功能,写进注释里面,附带链接分享和效果图展示。(更新中....) 二、Title option {title: {text: Weekl…

2-52 基于matlab局部信息的模糊C均值聚类算法(FLICM)

基于matlab局部信息的模糊C均值聚类算法(FLICM),是在FCM聚类算法的基础上结合了图像的邻域信息,有更好的鲁棒性。程序已调通,可直接运行。 2-52 局部信息的模糊C均值聚类算法 - 小红书 (xiaohongshu.com)

【Canvas与艺术】七角大楼

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>七角大楼</title><style type"text/css">.cen…

【Python/PyCharm】卸载、安装、配置环境、及错误解决(保姆篇)

文章目录 卸载python安装python手动配置python环境变量安装pycharm创建一个工程错误解决 更多相关内容可查看 卸载python 卸载Python&#xff0c;建议去控制面板&#xff0c;找到Python.exe和python.launcher&#xff0c;右键卸载即可 安装python 点击windows官网下载链接选择…

AI模型离线测试指南:测试方法、评估指标与提升技巧

模型离线测试作为评估人工智能模型性能的重要手段&#xff0c;在人工智能系统测试技术中占据非常重要的位置。通过模型的离线测试&#xff0c;我们可以深入洞察模型的性能&#xff0c;为后续优化提供有效的数据支持。本文我们将从人工智能模型离线测试的概念入手&#xff0c;逐…

YOLO格式转Labelme | 标签信息 | 辅助标注 | txt转json

前言 本文分享将常规的YOLO检测信息&#xff0c;转为Labelme中的标签信息。 即&#xff1a;xxx.txt 转 xxx.json。YOLO版本支持YOLOv8、YOLOv5等。 通过模型预测的信息&#xff0c;有了大致的检测位置和类别信息&#xff0c;人工进行微调和审核即可&#xff0c;实现辅助标注…

手摸手教你撕碎西门子S7通讯协议17--【再爆肝】通讯库应用开发wpf版

1、先看颜值 这颜值是采用wpf渲染技术实现的&#xff0c;里面用到很多控件&#xff0c;有第三方控件&#xff0c;也有自定义控件&#xff0c;怎么样&#xff0c;比车模还漂亮吧&#xff0c;超过脸模。 2、实现思路 程序启动时&#xff0c;连接西门子PLC&#xff0c;然后主动读…

计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(下)

文档编辑软件Word 2016 5.4 Word 2016的表格应用5.4.1 创建表格5.4.2 编辑表格5.4.3 设置表格 5.5 Word 2016的图文混排5.5.1 文本框操作5.5.2 图片操作5.5.3 形状操作5.5.4 艺术字操作 5.6 Word 2016的页面格式设置5.6.1 设置纸张大小、页面方向和页边距5.6.2 设置页眉、页脚和…

【通俗理解】贝叶斯定理——证据如何更新信念

【通俗理解】贝叶斯定理——证据如何更新信念 信念更新的类比 你可以把贝叶斯定理比作一个“信念调节器”&#xff0c;它根据新的证据来调节我们对某一事件发生的信念强度。 贝叶斯定理的核心作用 组件/步骤描述先验概率在获得新证据之前&#xff0c;对某一事件发生的概率的估…

Mac电脑数据恢复软件 Disk Drill 企业版安装

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将拖入文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;运行软件&#xff0c;点击安装&#xff0c;软件页面打开表示安装成功 三、运行测试1、打开软件&#xff0c;恢复一个…

Jenkins自动化构建运行Springboot项目

通过在Jenkins中创建流水线任务&#xff0c;编写流水线脚本以实现自动化构建和部署SpringBoot项目 好处 自动化: 自动化整个部署流程&#xff0c;减少人工干预&#xff0c;降低出错率。 一致性: 确保每次部署都遵循相同的步骤和配置&#xff0c;提高部署的一致性。 快速反馈…

临沂厚朴里升腾的文旅“烟火气”为城市“夜”经济贡献新活力

“一街兴一城、一街促百业”的案例不胜枚举&#xff0c;一如北京王府井大街古今交融的馥郁人文、上海南京路万国风貌的时尚繁华、成都春熙路美食飘香的热辣滚烫…无不成为其所在城市的一张靓丽名片&#xff0c;吸引着大量的当地居民和外来游客&#xff0c;为城市的经济发展和人…

Matlab|考虑大规模电动汽车接入电网的双层优化调度策略

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《A bi-layer optimization based temporal and spatial scheduling for large-scale electric vehicles》&#xff0c;中文文献可对照《考虑大规模电动汽车接入电网的双层优化调度策略》&…