首页 > 其他分享 >单链表进阶OJ版--->随机指针问题

单链表进阶OJ版--->随机指针问题

时间:2023-04-05 20:39:01浏览次数:33  
标签:链表 进阶 10 process oss cur --- image OJ

朋友们,晚上好!!今天,推出一篇单链表的随机指针问题!!

相较于之前的链表OJ题,本期的链表难度有所提升!!下面请看题 :>

有一个链表, 链表每个结点额外增加一个随机指针 random ,并且随机指针可以指向链表的任何结点以及空结点

至于本题的要求是 : 复制带随机指针的链表

如下图所示 :>

单链表进阶OJ版--->随机指针问题_随机指针

本题的难度,大致在于 随机指针的指向不好把控 !!

那么, 具体实现的思路,有哪些呢?

大体上, 可以分为三点 :

1.拷贝原链表的每个结点,连接到原节点的后面

2.将随机指针的拷贝值连接在原链表随机值的下一个位置(至于原因,稍后解释)

3.拆解链表, 将新的链表与旧链表分离开

大体上,思路就这些了。现在,开始我们的代码实现吧!!

/*
typedef int SLTDataType;

typedef struct SListNode
{
	SLTDataType data;
  struct SListNode* next;
  struct SListNode* random;
}SLTNode;

*/

SLTNode* copyRandomList(SLTNode* phead)
{
	SLTNode* cur = phead;
  //1.拷贝原链表的每个结点,连接到原节点的后面
  while(cur)
  {
  	SLTNode* next = cur ->next;
    
    SLTNode* copy = (SLTNode*)malloc(sizeof(SLTNode));
    copy ->data = cur ->data;
    
    //插入链接
    cur ->next = copy;
    copy ->next = next;
    
    //迭代
    cur = next;
  }
  
  //将随机指针的拷贝值连接在原链表随机值的下一个位置
  cur = phead;
  while(cur)
  {
  	SLTNode* copy = cur ->next;
    
    if(cur ->random == NULL)
    {
      copy ->random = NULL;
    }
    else
    {
    	copy ->random = cur ->random ->next;
    }
    
    //迭代
    cur = cur ->next ->next;
  }
  
  //3.拆解链表, 将新的链表与旧链表分离开
  cur = phead;
  SLTNode* copyHead = NULL, *copyTail = NULL;
  while(cur)
  {
  	SLTNode* copy = cur ->next;
    
    if(copyTail == NULL)
    {
    	copyHead = copyTail = copy;
    }
    else
    {
    	copyTail ->next = copy;
      copyTail = copyTail ->next;
    }
    
    //恢复旧链表
    cur ->next = copy ->next;
    cur = next;
  }
  return copyHead;
}

为了各位好友,方便观看,特别附上有色彩观感的代码图样 :

单链表进阶OJ版--->随机指针问题_单节点含有额外指针_02

首先是第一个步骤 :

单链表进阶OJ版--->随机指针问题_单链表_03

附上图示样板 :

单链表进阶OJ版--->随机指针问题_分过程_04

之后是第二个步骤 :

单链表进阶OJ版--->随机指针问题_单节点含有额外指针_05

再附上图示样板 :

单链表进阶OJ版--->随机指针问题_随机指针_06

现在解析 --->“精华所在”

注意看上图所示的橙色线条,如何将新结点的 random 链接在 指定 新节点的正确位置,也就是同旧链表的链接方式相同!!

比如,将新节点的 13 的 random 链接在 7 上如何操作,能符合原先链表的链接

答案是 :先思考 旧链表与新链表之间的联系。而由第一个步骤,我们知道,新链表的每个节点位置在原节点的后面!!如此,便确立了突破口!!

现在看看,旧链表的 13 的 random 是如何链接在 7 上面的,显然是 “cur -> random”

这句代码 就代表了 13 指向了 7 这个位置,而 7 又通过 一个 “next”指向了 新节点 7 的位置

如此,我们不难理解,代码“copy ->random = cur -> random ->next”

即新节点 13 是如何将随机指针 random 指向 7 的位置了!!

最后是第三个步骤 :

单链表进阶OJ版--->随机指针问题_单链表_07

再附上图示样板 :

单链表进阶OJ版--->随机指针问题_单节点含有额外指针_08

单链表进阶OJ版--->随机指针问题_分过程_09

单链表进阶OJ版--->随机指针问题_分过程_10

至此,本期讲解就到这里了!!

感谢好友阅读!!愿共同进步!!

标签:链表,进阶,10,process,oss,cur,---,image,OJ
From: https://blog.51cto.com/u_15808800/6171604

相关文章

  • 【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(二)HLS 指令详解
    源码地址:https://github.com/Tinywan/PHP_Experience一、在Nginx配置文件的RTMP模块中配置hlshls_key_path/tmp/hlskeys;提示错误信息:nginx:[emerg]thesamepathname"/data/hlskeys"usedin/usr/local/nginx/conf/nginx.conf:178andin/usr/local/nginx/conf/nginx......
  • 被ST-Link【The content of ST-Link is corrupt】【Communication error with ST-Link
    直接跳转【4】看解决方法,祝大家都顺利解决【1】我的尝试   【2】我的错误情况【3】我无用的努力【尝试1:点击setting之后的第一个debug页面里面的port要改成sw,不然下载不成功】,其实这样只是比较节约端口而已,当然一般还是都选择【SW】  【尝试2:output里记得把crea......
  • 设计模式(三十二)----综合应用-自定义Spring框架-自定义Spring IOC-自定义Spring IOC
    1自定义SpringIOC总结1.1使用到的设计模式工厂模式。这个使用工厂模式+配置文件的方式。单例模式。SpringIOC管理的bean对象都是单例的,此处的单例不是通过构造器进行单例的控制的,而是spring框架对每一个bean只创建了一个对象。模板方法模式。AbstractApplicationC......
  • 【官方文档】Nginx模块Nginx-Rtmp-Module学习笔记(一) RTMP 命令详解
    源码地址:https://github.com/Tinywan/PHP_Experience说明:rtmp的延迟主要取决于播放器设置,但流式传输软件,流的比特率和网络速度(以及响应时间“ping”)可能会对延迟产生影响,具有播放器的本地rtmp服务器使用“否”缓冲区(如0.1-0.2秒缓冲区等)可能会在0.8-1.2秒之间总是延迟,当事情正......
  • Springboot整合TX-LCN实现分布式事务
    前言TX-LCN是一款国产分布式事务协调框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。本文讲解如何使用Springboot作为基础,来配置使用TX-LCN。需要MySQL和Redis。名词解释TM(Tx-Manager/TransactionManager)事务协调者TC(Tx-Client......
  • python---飞机大战小游戏(提供源码)
    项目准备:本项目在pycharm平台实现,需要安装pygame等模块游戏功能:敌机会从不同位置出现且具有不同的速度,飞机可以发射子弹击毁敌机,飞机触碰到敌机会被击落,游戏结束效果演示飞机大战视频演示完整代码项目主要有两个文件构成,分别是plane_main.py文件和plane_sprites.py文件。plane_mai......
  • Springboot+ElasticJob-Lite实现集群任务调度
    前言ElasticJob-Lite是集群环境下应用(比如SpringCloud微服务)任务调度的解决方案。集群部署的时候,一个定时任务会有多个进程执行,如果不进行任何处理,会导致任务触发的时候每个进程重复执行一次。解决办法有两种:一种是加锁,保证同时只有一个进程执行任务,比如用分布式锁,或者用任务调......
  • 蓝桥-单词分析
    https://www.lanqiao.cn/problems/504/learning/?page=1&first_category_id=1&sort=students_count&second_category_id=3#include<bits/stdc++.h>//包含所有常用的头文件usingnamespacestd;intmain(){map<char,int>m;//定义一个map,用于存储字符和出现次数的......
  • python-爬虫-css提取-写入csv-爬取猫眼电影榜单
    猫眼有一个电影榜单top100,我们将他的榜单电影数据(电影名、主演、上映时间、豆瓣评分)抓下来保存到本地的excle中本案例使用css方式提取页面数据,所以会用到以下库importtimeimportrequestsimportparsel#解析库,解析cssimportcsv#爬取的数据写入csv创建csv文件标头信息......
  • docker-compose 通过NGINX快速搭建负载均衡的Tomcat集群
                 docker-compose通过NGINX快速搭建负载均衡的Tomcat集群从标题也可以看出,需要三个软件,docker-compose,docker-ce(docker的运行环境),Tomcat的镜像。docker-compose和docker的安装就不用说了,都可以离线安装,安装方法见博客:(docker-compose安装方......