链表的带环问题 链表的深度拷贝

1.1. 链表是否带环

代码很简单,最主要就是如何证明

  1. 首先判断链表是否带环,可以定义两个指针,一个快指针一个慢指针。快指针走两步,慢指针走一步
  2. 一定会相遇吗?有没有可能会超过?
  3. 假设进环的时候fast和slow的相隔距离是N,每走一步就是N - 1 当到了0的时候就会追上
  4. 意思就是说:每次追击,距离都会-1,此时不管是偶数环还是奇数环都没关系
  5. 这里用动图来解释一下,在这个动图中C = 5

bool hasCycle(struct ListNode *head) {struct ListNode* slow = head,*fast = head;while(fast && fast->next)//假设没有环,正常链表的情况下{slow = slow->next;fast = fast->next->next;if(slow == fast)return true;} return false;
}

1.2. 问题2

  1. 此时用动图来说明问题,N分为偶数和奇数的情况,但是这个建立在slow走1步,fast走3步的情况
  2. fast走3步,意味着每次的追击距离 - 2
  3. 下面这个表示为偶数的情况

  1. 下面这个是奇数的情况,当追过头的时候C - 1 = 偶数,下一轮就能追上

  1. slow走1步,fast 走3步、4步、5步,可以吗?一定会追上吗?请证明
  2. 假如同时存在N为奇数,C为偶数那么就永远追不上了

  1. 满足条件的:
    1. 为偶数个时候就能追上
    2. N是奇数的时候第一轮会超过1个,第二趟C-1为偶数 就可以追上了
  2. 所以终究还是有机会追上的对吗?(doge)

1.3. 返回链表开始入环的第一个节点

  1. 推导过程,根据公式推导L = (X - 1)* C + C - N;
  2. x 表示: slow进环前走了多少圈 ,C 是一圈的距离。x最少走一圈,不然等式就不会成立

struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow = head,*fast = head;while(fast && fast->next){slow = slow->next;fast = fast->next->next;if(fast == slow)//此时说明是带环链表并且相遇了{struct ListNode* meet = fast;while(head != meet){head = head->next;meet = meet->next;}return meet;}}return NULL;
}

1.3.1方法2

  1. 在开始之前,先说一下相交链表,然后再实现第二个方法
  2. 相交链表,题目链接

  1. 思路
    1. 首先判断是否相交?遍历链表找到尾节点
    2. 再找尾节点的同时顺便记录两个链表的长度
    3. 两个链表相减,用abs();函数得出绝对值,让长链表走相减步数,使得和短链表长度一致
    4. 最后让两个链表不相等的表达式做出判断。假如相等跳出循环,得出的就是相交的起始节点
  1. 注意:修改代码时需要想到被影响的值也需要进行修改
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* curA = headA,*curB = headB;int lenA = 1,lenB = 1;//这里+1,因为遍历链表时,满足条件最后一个节点不进入while(curA->next)//这里是找未节点{curA = curA->next;lenA++;}while(curB->next){curB = curB->next;lenB++;}if(curA != curB)return NULL;//假设法int Dval = abs(lenA - lenB);//求绝对值struct ListNode* LongList = headA,*ShortList = headB;//这个假设 headA是长链表if(lenB > lenA)//假设失败,headB更长,此时让 B成为长链表{LongList = headB;ShortList = headA;}while(Dval--)//走差值步{LongList = LongList->next;}while(LongList != ShortList){LongList = LongList->next;ShortList = ShortList->next;}//走到这说明前面条件都满足了return LongList;//return headA;更改代码有很多地方可以都有牵连,这里就是,经量不要拿原指针,以防找不到最初指向
}
  1. 就是快慢指针相遇后,断开meet节点,创建一个新的节点,新的节点拿到meet->next,指向的下一个节点的地址就行。可以发现最后变成了相交链表的问题

  2. 调用上面的相交链表的函数,返回的节点就是,入环时的第一个节点

struct ListNode* ListIntersectNode(struct ListNode* listA,struct ListNode* listB)
{struct ListNode* curA = listA,*curB = listB;int lenA = 0,lenB = 0;while(curA)//找共同尾节点{curA = curA->next;lenA++;}while(curB){curB = curB->next;lenB++;}int k = abs(lenA - lenB);//假设法struct ListNode* longlist = listA,*shortlist = listB;if(lenB > lenA){longlist = listB;shortlist = listA;}//让长的链表走差值步while(k--){longlist = longlist->next;}while(longlist != shortlist){longlist = longlist->next;shortlist = shortlist->next;}return longlist;
}
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode* slow = head,*fast = head;while(fast && fast->next)//不是带环链表时{slow = slow->next;fast = fast->next->next;if(slow == fast)//此时相遇{struct ListNode* meet = fast;struct ListNode* newnode = meet->next;meet->next = NULL;return ListIntersectNode(head,newnode);}}return NULL;
}

2. 链表的深度拷贝

  1. 题目的要求是说拷贝对应原节点的值,并且和原链表的指向表示相同的方向
  2. 注意:每个节点一定不可以指向原链表,要指向拷贝链表

  1. 第一步,建立联系
    1. 首先在原链表每个节点后面都插入一个节点,拷贝前一个值
    2. 然后和在这个两链表之间插入,与之和这个原链表建立联系
  2. 第二步,解决random指向
    1. random的指向是随机的所以我们可以通过前一个节点来访问对应指向,保存copy位置节点
    2. random的情况可能指向为NULL,正常有节点的情况 看到图中
    3. 可以得出copy->random = cur->random->next ;这样就指向了之前拷贝在节点后的 7 了,这样拷贝的链表就建立了联系
  3. 分离链表
    1. 这个通过尾插的方式来把原链表上复制的几点取下来,所以需要一个头节点和尾节点 为什么?因为题目要求最后要返回一个头节点,而我们要尾插节点 
    2. 看上面的图,这里创建两个 copy的节点和一个after节点,刚好有三个节点还可以顺便还原 原链表
    3.  只要尾插到后面就行了,链表尾插还不会的可以去看看之前的博客,这里详细的讲了如何尾插--> 单链表的文章

struct Node* copyRandomList(struct Node* head) {if(head == NULL)return NULL;struct Node* cur = head;while(cur){struct Node* CopyNode = (struct Node*)malloc(sizeof(struct Node));CopyNode->val = cur->val;//拷贝值//链接前后节点CopyNode->next = cur->next;cur->next = CopyNode;cur = CopyNode->next;//跳到copy的后一个节点}//解决random的指向cur = head;while(cur){struct Node* copy = cur->next;if(cur->random == NULL)//原链表指向NULL,拷贝的链表也指向NULL{copy->random = NULL;}else//本题中精华代码部分{copy->random = cur->random->next;}cur = copy->next;}//分离链表struct Node* copyhead = NULL,*copytail = NULL;cur = head;while(cur){struct Node* copy = cur->next;//图中所标是第二次遍历时的位置struct Node* after = copy->next;if(copyhead == NULL){copyhead = copytail = copy;}else//尾插{copytail->next = copy;copytail = copytail->next;//因为前面已经尾插了一个数据,所以到下一个位置}//链表的恢复cur->next = after;cur = after;}return copyhead;
}

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

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

相关文章

【翻译】REST API

自动伸缩 API 创建或更新自动伸缩策略 API 此特性设计用于 Elasticsearch Service、Elastic Cloud Enterprise 和 Kubernetes 上的 Elastic Cloud 的间接使用。不支持直接用户使用。 创建或更新一个自动伸缩策略。 请求 PUT /_autoscaling/policy/<name> {"rol…

【大模型学习】私有大模型部署(基础知识)

私有大模型 优点 保护内部隐私 缺点 成本昂贵 难以共享 难以更新 大模型底座 基础知识点 知识库 知识库是什么&#xff1f; 知识库的作用是什么&#xff1f; 微调 增强大模型的推理能力 AI Agent 代理&#xff0c;与内部大模型进行交互 开源 and 闭源 是否可以查…

40 生产者消费者模型

生产者消费者模型 概念 为何要使用生产者消费者模型&#xff0c;这个是用过一个容器解决生产者和消费的强耦合问题。生产者和消费者之间不需要通讯&#xff0c;通过阻塞队列通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xf…

ue引擎游戏开发笔记(28)——实现第三人称越肩视角

1.需求分析 实现一个第三人称越肩视角 2.操作实现 1.思路&#xff1a;建立一个弹簧臂和摄像机&#xff0c;调整两者位置达到越肩效果。 2.直接在蓝图操作&#xff1a;添加摄像机和弹簧臂&#xff1a; 3.对弹簧臂勾选使用pawn控制旋转&#xff0c;并适当调整摄像机和弹簧臂位置…

Flask表单详解

Flask表单详解 概述跨站请求伪造保护表单类把表单渲染成HTML在视图函数中处理表单重定向和用户会话Flash消息 概述 尽管 Flask 的请求对象提供的信息足够用于处理 Web 表单&#xff0c;但有些任务很单调&#xff0c;而且要重复操作。比如&#xff0c;生成表单的 HTML 代码和验…

在智慧城市的建设中智能车载监控录像机发挥什么作用

引言 随着科技的快速发展&#xff0c;智慧城市的概念逐渐深入人心。在智慧城市的建设中&#xff0c;智能车载监控录像机作为一种重要的技术工具&#xff0c;发挥着越来越重要的作用。本文将从多个方面探讨智能车载监控录像机在智慧城市建设中的作用。 一、智能车载监控录像机概…

计算机视觉大项目(1)-水果分级系统

项目来源&#xff1a;河北大学计算机视觉课程-杨老师. 一共有四个标题&#xff0c;本篇博客只完成前两问。 目录 实验目的: 实验内容&#xff1a; 实验步骤&#xff1a; 1.水果图像的分割 >掩膜图像Mask 是什么&#xff1f; >改进:去除反光部分的影响 2&#xf…

npm install digital envelope routines::unsupported解决方法

目录 一、问题描述二、问题原因三、解决方法 一、问题描述 执行命令 npm install 报错&#xff1a;digital envelope routines::unsupported 二、问题原因 Node.js 17 版本引入了 OpenSSL 3.0&#xff0c;它在算法和密钥大小方面实施了更为严格的限制。这一变化导致 npm 的升…

excel怎么删除条件格式规则但保留格式?

这个问题的意思就是要将设置的条件格式&#xff0c;转换成单元格格式。除了使用VBA代码将格式转换外&#xff0c;还可以用excel自己的功能来完成这个任务。 一、将条件格式“留下来” 1.设置条件格式 选中数据&#xff0c;点击开始选项卡&#xff0c;设置条件格式&#xff0…

Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍

往期回顾 【QT进阶】Qt线程与并发之QtConcurrent返回值与run方法的参数说明-CSDN博客 Qt绘图与图形视图之绘图技术知识点的简单介绍-CSDN博客 Qt绘图与图形视图之常见图形、路径、文字、图片的绘制介绍-CSDN博客 Qt绘图与图形视图之移动鼠标手动绘制任意多边形的简单介绍 一、…

【深度学习】第一门课 神经网络和深度学习 Week 4 深层神经网络

&#x1f680;Write In Front&#x1f680; &#x1f4dd;个人主页&#xff1a;令夏二十三 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;深度学习 &#x1f4ac;总结&#xff1a;希望你看完之后&#xff0c;能对…

临期食品店会员配送商城小程序的作用是什么

临期商品以量大价格低/即时性吸引市场大量客户&#xff0c;很多地区都有门店&#xff0c;行业也不乏连锁/加盟品牌&#xff0c;食品受众广且区域拓展性强&#xff0c;商家可线上销售提升营收和解决线下难题。 商家运用【雨科】平台搭建临期食品店商城小程序&#xff0c;对生意…

PyTorch如何修改模型(魔改)

文章目录 PyTorch如何修改模型&#xff08;魔改&#xff09;1.修改模型层(模型框架⭐)1.1通过继承修改模型1.2通过组合修改模型(重点学&#x1f440;)1.3通过猴子补丁修改模型 2.添加外部输入3.添加额外输出参考 PyTorch如何修改模型&#xff08;魔改&#xff09; 对模型缝缝补…

【算法刷题 | 动态规划02】5.02(不同路径、不同路径||、整数拆分、不同的二叉搜索树)

文章目录 5.不同路径5.1题目5.2解法一&#xff1a;深度搜索5.2.1深度搜索思路5.2.2代码实现 5.3解法二&#xff1a;动规5.3.1动规思路5.3.2代码实现 6.不同路径||6.1题目6.2解法&#xff1a;动规6.2.1动规思路&#xff08;1&#xff09;dp数组以及下标含义&#xff08;2&#x…

基于Springboot的交流互动系统

基于SpringbootVue的交流互动系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…

Python语言零基础入门——文件

目录 一、文件的基本概念 1.文件 2.绝对路径与相对路径 3.打开文件的模式 二、文件的读取 三、文件的追加 四、文件的写入 五、with语句 六、csv文件 1.csv文件的读取 2.csv文件的写入 七、练习题&#xff1a;实现日记本 一、文件的基本概念 1.文件 文件是以计算…

Mysql中索引的概念

索引相关概念 基础概念&#xff1a; 在MySQL中&#xff0c;索引是一种数据结构&#xff0c;用于加快数据库查询的速度和性能。索引可以帮助MySQL快速定位和访问表中的特定数据&#xff0c;就像书籍的索引一样&#xff0c;通过存储指向数据行的指针&#xff0c;可以快速…

ICode国际青少年编程竞赛- Python-1级训练场-路线规划

ICode国际青少年编程竞赛- Python-1级训练场-路线规划 1、 Dev.step(3) Dev.turnLeft() Dev.step(4)2、 Dev.step(3) Dev.turnLeft() Dev.step(3) Dev.step(-6)3、 Dev.step(-2) Dev.step(4) Dev.turnLeft() Dev.step(3)4、 Dev.step(2) Spaceship.step(2) Dev.step(3)5、…

Android手写自己的路由SDK

实现自己的路由框架 ​ 在较大型的Android app中常会用到组件化技术&#xff0c;针对不同的业务/基础功能对模块进行划分&#xff0c;从上到下为壳工程、业务模块、基础模块。其中业务模块依赖基础模块&#xff0c;壳工程依赖业务模块。同级的横向模块&#xff08;比如多个业务…

软件杯 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…