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

这篇具有很好参考价值的文章主要介绍了复杂链表的复制(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
复杂链表的复制(C语言),链表,c语言,数据结构,开发语言

算法原理

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

2.控制拷贝结点的random:拷贝结点的random是原结点random->next
3.拷贝节点离开原结点,恢复原链表文章来源地址https://www.toymoban.com/news/detail-858641.html

代码实现

struct Node { 
    int val;          // 定义节点的值
    struct Node* next;  // 指向下一个节点的指针
    struct Node* random; // 指向随机节点的指针
};

struct Node* copyRandomList(struct Node* head) { 
    // 定义一个当前节点的指针 cur,初始化为头节点 head
    struct 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;
        // 控制拷贝节点的 random
        cur = head; 
        while (cur) { 
            // 获取当前节点的下一个节点
            struct Node* copy = cur->next; 
            // 判断当前节点的 random 是否为空
            if (cur->random == NULL) {  // 这里将 = 改为 ==
                // 如果为空,将新节点的 random 设置为 NULL
                copy->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; 
            // 如果尾节点为 NULL
            if (copyTail == NULL) { 
                // 将头节点设置为当前节点
                copyHead = copyTail = copy; 
            } 
            else { 
                // 将尾节点的下一个节点设置为当前节点
                copyTail->next = copy; 
                // 更新尾节点为当前节点
                copyTail = copyTail->next; 
                // 将当前节点的下一个节点设置为下一个节点
                cur->next = next; 
                // 移动到下一个节点
                cur = next; 
            } 
            // 返回拷贝后链表的头节点
            return copyHead; 
    } 
}

到了这里,关于复杂链表的复制(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言数据结构——链表的实现及其基本操作

    顺序表的问题及思考 问题: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有数据插

    2023年04月09日
    浏览(85)
  • C语言---数据结构实验---顺序表的合并---链表的基本操作---重点解析约瑟夫问题

    实验的写法多种多样,但本文并未采用 #define 定义容量的写法,这样写已经是很老旧过时的写法。所有实验主体采用均为动态开辟,后续如果利用 C++ 来写或许会应用更多语法… 本篇展示数据结构的两个实验 其中,重点分析约瑟夫问题 实验中代码的命名风格等均与下方博客

    2024年02月16日
    浏览(70)
  • 数据结构_链表_双向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月26日 V1.0 发布于博客园 目录 目录 双向循环链表公式 初始化双向循环链表 构建双向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 DoubleCirLList.h

    2024年04月27日
    浏览(55)
  • 数据结构_链表_单向循环链表的初始化、插入、删除、修改、查询打印(基于C语言实现)

    版本: 2024年4月25日 V1.0 发布于博客园 目录 目录 单向循环链表公式 初始化单向循环链表 构建单向循环链表结点 创建一个空链表(仅头结点) 创建一个新结点 插入数据 头插 中插 尾插 删除数据 头删 中删 尾删 查询打印数据 遍历打印 测试 测试结果: 完整代码 CircularLinkedLis

    2024年04月25日
    浏览(51)
  • 每日一题——复杂链表的复制

    题目链接 如果不考虑 random 指针的复制,仅仅复制单链表的结构还是简单的。只需要通过一个指针 cur 遍历原链表,再不断创建新节点尾插到 newHead 后即可。 但如果要考虑 random 指针的复制,那过程就复杂了。 有小伙伴会这样想:既然原链表和复制的链表的结构一致,那么对

    2024年02月14日
    浏览(27)
  • 剑指 Offer 35. 复杂链表的复制

    请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。 示例 1: 输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]] 输出:[[7,null],[13,0],[11,4],[10,2],[1,0]] 示例 2: 输入:head = [[1

    2024年02月15日
    浏览(52)
  • <数据结构> 链表 - 链表的概念及结构

    概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的 逻辑顺序 是通过链表中的 指针链接 次序实现的 1、链表由一系列结点(链表中每一个元素称为结点)组成。 2、结点可以在运行时动态(malloc)生成。 3、每个结点包括两个部分:一个是存储数据元素的

    2023年04月09日
    浏览(46)
  • 【数据结构】反转链表、链表的中间节点、链表的回文结构(单链表OJ题)

    正如标题所说,本文会图文详细解析三道单链表OJ题,分别为:  反转链表 (简单)  链表的中间节点 (简单)  链表的回文结构 (较难) 把他们放在一起讲的原因是:  反转链表 和  链表的中间节点 是  链表的回文结构 的基础 为什么这样说?请往下看: 目录 1. 反转链

    2024年02月13日
    浏览(72)
  • 【数据结构】链表的回文结构

    单链表的操作算法是笔试面试中较为常见的题目。 本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _ 😀 对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。 给定一个链表的头指针

    2024年02月12日
    浏览(55)
  • 【数据结构】链表的分类和双向链表

    本篇是基于上篇单链表所作,推荐与上篇配合阅读,效果更加 http://t.csdnimg.cn/UhXEj 链表的结构非常多样,以下情况组合起来就有8种(2 x 2 x 2)链表结构: 我们一般叫这个头为哨兵位 我们上回讲的单链表就是不带头单项不循环链表。 今天我们要讲带头双向循环的链表。 不过

    2024年01月25日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包