当前位置: 首页 > news >正文

金华城乡建设部网站首页黄冈seo顾问

金华城乡建设部网站首页,黄冈seo顾问,做网站 找风投,兰州网站开发企业141环形链表 文章目录快慢指针快慢指针 代码思路: slow 和fast 指向 head slow走一步,fast走两步 没有环: fast每次走2步 ,如果 fast 最终遇到NULL(链表中的元素是 偶数)或者fast->next(链表中的元素是 奇数)遇到NULL&#xf…

141环形链表

文章目录

  • 快慢指针

快慢指针

代码思路:

slow 和fast 指向 head slow走一步,fast走两步

没有环:

fast每次走2步 ,如果 fast 最终遇到NULL(链表中的元素是 偶数)或者fast->next(链表中的元素是 奇数)遇到NULL,说明链表中没有环

在这里插入图片描述

有环:

如果 fast 和 slow指针在途中相遇 ,说明这个链表有环

因为fast 比slow 走的快 , 如果 fast 最终和 slow 相遇,那肯定是 fast 超过了 slow 一圈,说明链表中含有环。

bool hasCycle(struct ListNode *head){struct ListNode * slow =head , * fast = head ;//假设带环while ( fast!= NULL && fast->next != NULL){ fast =fast->next->next ;slow = slow->next ;if( slow  == fast )  //因为fast每次走2步 ,slow每次走一步 如果有环 那一定是fast追上slow 也就是相遇{return true ;}}//fast 为NULL 或者 fast->next 为NULL    如果 fast 最终遇到空指针,说明链表中没有环 return false ; 
}

我们证明一下这个逻辑问题:

为什么 slow 走一步 fast 走两步 ,fast 和slow 会相遇 ,有没有可能会错过

假设slow 刚开始进环的时候 slow 和fast 的距离是N ,slow开始进环的时候 fast开始追及slow ,因为fast 每次走两步 ,而slow 每次走一步 ,也就是说在追及的过程中 fast 与slow每次缩短一步的距离
不管N 是否为奇数还是偶数 , N每次减一 ,迟早为0 ,也就意味着fast 追上了 slow

在这里插入图片描述

那我们再推广一下

如果slow 走一步 ,fast 走 X 步( X >=3) ,fast 和slow 会相遇 ? 或者有可能错过?
假设slow刚开始进环 ,fast 和slow 的距离是N
slow进环以后 fast 开始追及slow ,slow每次走一步 ,fast 就走三步 ,距离缩小 2 步
如果N 是偶数 N -2 , N-4 , N - 6 , 4 , 2 …N可以减到零
如果N 是奇数 N -2 , N-4 , … 3 ,1, -1
我们假设环的周长是C ,N 是 -1 , 也就是说 fast 和slow 的距离变成了 C-1 ,又开始了新的一轮追及

在这里插入图片描述


142.环形链表II

结论 : 一个指针(fast)从相遇点开始走 ,一个指针(slow)从起始点开始走 ,会在入口点相遇

结论千万不要理解为slow 去追fast 了 ,其实是fast追slow ,只不过fast走的快 ,可能在环里转了n 圈
一旦slow走到入口点 ,fast 就会和slow 相遇

下面我们来证明一下上述结论:
假设起始点到入口点处的距离是L , 入口点处到相遇点的距离为X
环的长度为C
在这里插入图片描述

那么可以推出slow 走的距离为L + X ,
fast 走的距离是 L+ n* C + X ,
n* C 表示 slow 进环前 ,fast 在环里转了n*C 圈

根据fast 走的距离 是slow 的两倍
2(L+X ) = L + n *C + X
推出 L= n * C -X

将这个推导式变形 得到 L = ( n -1) * C + C -X
即证明结论成立

struct ListNode *detectCycle(struct ListNode *head){struct ListNode * fast = head , * slow = head ;// 假设带环while ( fast != NULL && fast->next!=NULL){slow =slow->next ;fast =fast->next->next ;if( slow == fast )  {struct ListNode * meet = fast  ;  //相遇点struct ListNode * start = head ;//起始点while( meet!= start ) // 一个指针(fast)从相遇点开始走 ,一个指针(slow)从起始点开始走 ,会在入口点相遇{meet= meet->next ;start=start->next ;}return meet ;}}return NULL ; //不带环}

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

http://www.zhongyajixie.com/news/60833.html

相关文章:

  • 网站模版修改开鲁网站seo站长工具
  • qq音乐如何做mp3下载网站友情链接查询友情链接检测
  • 网站推广运营招聘整合营销活动策划方案
  • 商家自己做的商品信息查询网站长沙百度开户
  • 湖南手机版建站系统哪家好seo优化排名方法
  • 百度网网站建设的目标职业培训机构哪家最好
  • 铁路建设网站百度博客收录提交入口
  • 任何判断网站SEO做的好坏短视频推广引流方案
  • 厚街网站建设费用属于b2b的网站有哪些
  • 有网站了怎么做app山东济南seo整站优化公司
  • wordpress主题修改应用快照关键词优化
  • 做网站用到的单词如何进行搜索引擎优化?
  • 保险销售的建设网站策划书seo怎样优化网站
  • 专业科技网站建设2021十大网络舆情案例
  • 如何用api做网站查询网站流量的网址
  • 做投资网站广东东莞大益队
  • 专业微网站建设公司首选公司哪家好网络搭建是干什么的
  • 使用php做的网站什么软件比百度搜索好
  • 金华哪里有做网站的公司4000-262-北京营销公司比较好的
  • 邯郸市房价长沙企业seo优化
  • 重庆网站设计方案大数据营销系统多少钱
  • 佛山网站建设哪家好seo外链发布工具
  • 深圳通信管理局网站谷歌搜图
  • 网站开发后怎么进入互联网成都关键词排名推广
  • 做团购网站哪家好些每日新闻最新消息
  • 番禺网站开发哪家强建站seo是什么
  • 中国美食网站模板免费下载郑州百度seo排名公司
  • 创意字体设计网站绍兴百度seo排名
  • 景区微网站 建设方案seo服务套餐
  • 重庆做企业网站互联网广告投放