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

数据结构笔记5:环形链表的数理分析

链表OJ题:

环形链表:

使用快慢指针的方法:当慢指针和快指针相遇的时候证明链表是有环的。

证明:假设环的长度为C,入环前的长度为L。

假设fast在环内走了n圈。

当slow抵达第一个入环的节点时,fast和slow的距离为2L-n*c-L = L-n*C。

由于fast每次走两步,slow每次走一步,所以fast和slow之间的距离每次缩小一个单位。

当slow距离第一个入环的节点的距离为(n+1)*C-L时,fast和slow会相遇。

环形链表2:

当fast指针和slow指针相遇时

假设相遇位置为meet,相遇位置和入环节点的距离为L-n*C,如果meet要走L距离的话,那么就要走L-n*C(这是距离入环节点的距离) + n*C(这是绕环走一圈)= L。也就是说,当meet走L距离,肯定会停在入环节点处

所以我们可以定义一个cur指针,从头开始走,当cur指针和meet指针相遇的时候,也就是meet走了L距离的时候,也就是停在了入环节点的位置。

我们可以进一步假设:

前面的快慢指针方法是快指针走一步而慢指针走两步,那么要是快指针走三步而慢指针走一步呢?快慢指针判断是否有环还有效吗?

如果是fast走三步而slow走两步,第一个入环节点到fast的距离为(3L-L-n*C)也就是2L-n*C,fast到第一个入环节点的距离为(n+1)*C-2L。

而fast和slow的距离每次都会缩小两格,所以当(n+1)*C-2L 的值为偶数的时候,fast和slow可以直接相遇,而当(n+1)*C-2L为奇数的时候,fast和slow不会直接相遇,而是错过一格。

那时fast和slow的距离就变成了C-1.

如果C-1还是奇数的话,那下次fast和slow的距离也依旧是C-1。

但是这种可能存在吗?

当C-1是奇数时,说明C是偶数,前面说假设(n+1)*C-2L为奇数,当C是偶数时,(n+1)*C - 2L就不可能是奇数。

也就是说,要么(n+1)*C-2L为奇数,而C不为偶数,还是会相遇。

要么(n+1)*C-2L为偶数,直接相遇。

所以fast走三步slow走一步的这种设计,同样可以通过相遇来判断是否是带环链表。

环形链表:

 typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;if(fast == slow){return true;}}return false;
}

环形链表2:

typedef struct ListNode ListNode;ListNode* hascycle(ListNode* head){ListNode* fast = head;ListNode* slow = head;while(fast != NULL && fast->next != NULL){fast = fast->next->next;slow = slow->next;if(fast == slow)return fast;}return NULL;}
struct ListNode *detectCycle(struct ListNode *head) {ListNode* meet = hascycle(head);if(meet == NULL){return NULL;}ListNode * cur = head;while(cur != meet){cur = cur->next;meet = meet->next;}return cur;
}

http://www.dtcms.com/a/262853.html

相关文章:

  • mysql 小版本升级实战分享
  • 力扣 hot100 Day30
  • 开疆智能CCLinkIE转Canopen网关连接台达伺服驱动器配置案例
  • 自己电脑搭建本地服务器并实现公网访问,内网也能提供互联网连接使用
  • 七层负载均衡和四层负载均衡
  • 打卡day58
  • 数据库表关系设计详解:一对一、一对多、多对多及自关联
  • ShardingSphere完成MySQL集群部署
  • Vue3静态文档资源展示的实现和使用总结
  • 国产车哪款有远程代驾功能?远程代驾+自动驾驶
  • DDoS攻击及其防护方案
  • 超大js文件多层级引用缓存在网络较差的时候无法调用使用问题
  • Rust C++ OpenCV kafka-rs实践
  • 生成式人工智能实战 | 变分自编码器(Variational Auto-Encoder, VAE)
  • 二刷 苍穹外卖day09
  • macos 安装 xcode
  • 借助 KubeMQ 简化多 LLM 集成
  • 深度学习专栏总结
  • 生信分析之流式数据分析:Flowjo 软件核心功能全解析
  • Openssl升级
  • 使用 LoRA 微调大模型:关键参数与最佳实践全解析
  • 深度解析基于贝叶斯的垃圾邮件分类
  • 数字孪生技术为UI前端注入灵魂:实现产品全生命周期的可视化管理
  • 银河麒麟系统上利用WPS的SDK进行WORD的二次开发
  • linux docker 客户端操作数据卷
  • Excel转pdf实现动态数据绑定
  • [附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的校园服务平台管理系统,推荐!
  • 【甲方安全建设】敏感数据检测工具 Earlybird 安装使用详细教程
  • 6月30日作业
  • AR 学习:开启未来学习新视界​