链表中环形的入口
2015-12-08 15:18
363 查看
【题目描述】
一个链表中包含环,请找出该链表的环的入口结点。【解题思路】
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。
那么问题来了,如何判断一个链表是不是这类链表?如果链表为存在环,如果找到环的入口点? 当fast若与slow相遇时,slow肯定没有走遍历完链表(不是一整个环,有开头部分,如上图)或者恰好遍历一圈(未做验证,看我的表格例子,在1处相遇)。于是我们从链表头、相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇第一点为环入口点(慢指针走了n步,第一次相遇在c点,对慢指针来说n=s+p,也就是说如果慢指针从c点再走n步,又会到c点,那么顺时针的CB距离是n-p=s,但是我们不知道s是几,那么当快指针此时在A点一步一步走,当快慢指针相遇时,相遇点恰好是圆环七点B(AB=CB=s))。
【代码实现】
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* EntryNodeOfLoop(ListNode* pHead) { if(pHead==NULL) return NULL; ListNode* pAhead=pHead; ListNode* pBehind=pHead; while(pAhead!=NULL&&pAhead->next!=NULL) { pAhead=pAhead->next->next; pBehind=pBehind->next; if(pAhead==pBehind) break; } if(pAhead==NULL||pAhead->next==NULL) return NULL; pAhead=pHead; while(pAhead!=pBehind) { pAhead=pAhead->next; pBehind=pBehind->next; } return pBehind;//return pAhead; } };
相关文章推荐
- Service熟人
- OpenCV中的Resize和Reshape
- Java和C/C++的差异总结
- 定时器图片轮播
- POJ 2251-Dungeon Master(BFS)
- 【转】学习性能测试需要掌握的知识面
- Java——动态代理
- URL传递中文参数,Windows正常在后台获取参数,但Linux获取的参数是乱码 的解决方法。
- Java——动态代理
- JavaScript让HTML静态页面传值的方法
- [Java] Memcached Client For Java使用
- 04-树5 Root of AVL Tree
- 左旋转字符串
- 【高可用HA】Apache (1) —— Mac下安装Apache Httpd到自定义路径(非/etc/apache2)
- 继续第一个andoid工程
- cmake Debug模式和Release模式
- js正则表达式常用函数详解
- No resource found that matches the given name 'Theme.AppCompat.Light'.
- Spring:Spring整合Struts2
- 黑马程序员——Java重点基础之多线程(二)