复制带随机指针的链表

embedded/2024/10/18 18:21:17/


struct Node
{
    int val;
    struct Node* next;
    struct Node* random;
};
struct Node* copyRandomList(struct Node* head)
{
    struct Node* cur = head;
    //copy结点并插入原链表结点后面
    while (cur)
    {
        //创建新结点
        struct Node* copy = (struct Node*)malloc(sizeof(struct Node));
        //复制结点的值
        copy->val = cur->val;
        //新节点插入源链表
        copy->next = cur->next;
        cur->next = copy;
        //cur迭代往后遍历
        cur = copy->next;
    }
    //根据原结点的random处理copy的random
    cur = head;
    while (cur)
    {
        //copy指向复制链表的起点
        struct Node* copy = cur->next;
        if (cur->random == NULL)
        {
            copy->random = NULL;
        }
        //copy->random指向cur->random指向的结点的下一个结点,即next,
        // 通过桥接,使复制链表的random指向的位置于原链表相同
        else
        {
            copy->random = cur->random->next;
        }
        //cur迭代往后
        cur = copy->next;
    }
    //解开原链表和复制链表,还原原链表,链接复制的链表
    cur = head;//原链表的当前结点位置
    struct Node* copyHead = NULL, * copyTail = NULL;//复制链表的头尾
    while (cur)
    {
        struct Node* copy = cur->next;//复制链表的当前位置随着cur往后迭代
        struct Node* next = copy->next;//原链表的下一个结点位置随着cur也往后迭代
        if (copyHead == NULL)//第一个结点
        {
            copyHead = copyTail = copy;
        }
        else//尾插
        {
            copyTail->next = copy;//复制链表的链接
            copyTail = copy;//tial往后移到copy的位置
        }
        cur->next = next;//原链表还原
        cur = next;//cur往后移到next的位置
    }
    return copyHead;
}


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

相关文章

API容易被攻击,如何做好API安全

随着互联网技术的飞速发展和普及,网络安全问题日益严峻,API(应用程序接口)已成为网络攻击的常见载体之一。API作为不同系统之间数据传输的桥梁,其安全性直接影响到整个系统的稳定性和数据的安全性。 根据Imperva发布的…

政安晨【零基础玩转各类开源AI项目】基于本地Linux Ubuntu系统部署及应用强大的开源AI音乐生成工具:AudioCraft

目录 简介 部署 下载项目 创建虚拟环境 激活虚拟环境 安装依赖 启动 成功 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 简介 A…

ChatGPT3.5/新手使用手册——在线使用详细操作步骤

成长路上不孤单😊【14后小学生一枚,C爱好者,持续分享所学,今日分享主题【ChatGPT新手使用手册】,需要欢迎收藏转发😊😊😊😊😊😊😊&…

设计模式六大原则 —— 迪米特法则

设计模式六大原则 —— 迪米特法则 在软件设计领域,设计模式六大原则是一组被广泛接受和应用的指导原则,旨在帮助开发者构建更加稳定、灵活、可维护和可扩展的软件系统。这六大原则分别是:单一职责原则(Single Responsibility Pr…

《重生到现代之从零开始的C语言生活》—— 指针2

const const修饰变量 指针可以解引用修改变量,如果我们不想让它被修改可怎么办啊 这个就是const的作用 int main() {int a 0;a 10;printf("%d",a)const int b 0;b 11;printf("%d",b);return 0; }在此代码中,a是可以被修改的&…

逻辑回归解密:原理、公式和优化全解析

文章目录 一、 前言二、逻辑回归的原理和基本公式1. 逻辑回归的原理核心函数:Sigmoid函数 2. 逻辑回归模型3. 梯度上升法参数估计:最大似然估计对数似然函数求导过程参数更新 4. 梯度下降法参数估计:最小化损失函数逻辑回归的负对数似然函数梯…

ansible --limit 在指定主机执行任务

将任务只应用于指定的主机或主机组,而不是整个 inventory 中的所有主机。 限制单个主机 ansible-playbook -i hosts myplaybook.yml --limit "ip"限制多个主机 ansible-playbook -i hosts myplaybook.yml --limit "ip1,ip2,ip3"限制到主机组…

SpringBoot集成kafka-获取生产者发送的消息(阻塞式和非阻塞式获取)

说明 CompletableFuture对象需要的SpringBoot版本为3.X.X以上,需要的kafka依赖版本为3.X.X以上,需要的jdk版本17以上。 1、阻塞式(等待式)获取生产者发送的消息 生产者: package com.power.producer;import org.ap…