/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
if(head==NULL)
return NULL; ListNode *fast_node=head;
ListNode *slow_node=head;
do
{
if(slow_node->next!=NULL)//慢指针,一次挪一位
slow_node=slow_node->next;
else
return NULL; if(fast_node->next!=NULL)//快指针,一次挪两位
fast_node=fast_node->next;
else
return NULL;
if(fast_node->next!=NULL)//懒的想花里胡哨的方法了
fast_node=fast_node->next;
else
return NULL;
}while(slow_node!=fast_node);//只要有环一定会有两个指针相遇的情况 int num_cycle=;//看看环中多少个节点
do
{
fast_node=fast_node->next;
num_cycle++;
}while(fast_node!=slow_node); fast_node=head;//让fast_node先走num_cycle-1步
slow_node=head;
while(num_cycle!=)//注意这里是因为指针之差是节点数-1
{
fast_node=fast_node->next;
num_cycle--;
} while(fast_node->next!=slow_node)//二者并行前进,直到fast_node是尾节点,此时slow_node为环起点
{
fast_node=fast_node->next;
slow_node=slow_node->next;
} return slow_node;
}
};

分析:

这个题也见过,剑指offer,为了检测这个点,要分三步走:

先检测有环不,并检测环中任意节点;

再检测环中个数;

最后让一个指针先走一定步数,然后判断两个指针什么时候处于环的起点终点。

最新文章

  1. C#——传值参数(1)
  2. markdown简要说明源码
  3. 去掉mac终端里面hostname提示处的bogon
  4. UITableViewCell分割线左边部分缺少一些的解决方法
  5. 关于表格前面checkbox复选框不打勾的问题
  6. 【D3.V3.js系列教程】--(十四)有路径的文字
  7. Intent数据传递
  8. MTK MOTA升级步骤
  9. var dataObj=eval("("+data+")");//转换为json对象(解决在ajax返回json格式数据的时候明明正确的获取了返回值但是却就是进不去success方法的问题。格式错误)
  10. python 练完这些,你的函数编程就ok了
  11. aop 幂等验证(二)
  12. DWM1000 巧用Status 快速Debug
  13. 20165235 祁瑛 2018-4 《Java程序设计》第八周学习总结
  14. [Machine Learning][The Analytics Edge][Predicting Earnings from Census Data]
  15. duilib进阶教程 -- 在MFC中使用duilib (1)
  16. was控制台误禁用后的恢复启用办法
  17. Linux创建桥接网络
  18. .gitignore中添加的某个忽略文件并不生效
  19. Java入门:绘制简单图形
  20. python入门篇之介绍和流程控制(一)

热门文章

  1. css显示display、可见性visibility、定位position、对齐
  2. GitHub使用笔记2:github常用操作
  3. v-on事件绑定指令
  4. org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout() mybatis和spring-mybatis版本不匹配问题
  5. 记一次gitlab添加用户收不到邮件的解决办法
  6. VC++ 利用PDB和dump文件定位问题并进行调试
  7. Mysqldump 参数大全
  8. 数组中的元素 增加push用法 unshift() 方法 和减少pop() 方法 shift() 和其他位置增删 splice() 方法 join() 方法 reverse() 方法 sort() 方法
  9. 没有使用Material组件
  10. Windows操作系统下安装Ubuntu虚拟机