寻找带环的单链表的换的入口位置处的节点
来源:互联网 发布:海尔网络电视机 编辑:程序博客网 时间:2024/05/23 17:17
题目:
如本文题目,给定一个带环的单链表,给出一个算法求链表环的入口位置处的节点。
解析:
这题的解决步骤如下:
1.设置一个快指针fast和一个慢指针slow,它们同时从链表头开始往后遍历,快指针每次移动两个位置,慢指针每次移动一个位置
2.当快指针和慢指针相遇时,将慢指针重新指向链表头
3.快指针和慢指针此时在同时移动,两个指针都一次移动一个位置,当两个指针再次相遇时,指针所指的节点即入口节点
之所以这样能够定位环的入口节点,原因解析如下:
假设链表头节点为head,环入口节点为entrance,并假设有head到entrance共有n个节点(包括head,但不包括entrance),环的节点个数为m。我们知道,快指针和慢指针第一次相遇的节点肯定在环中,假设从entrance到这个节点共k个节点(包括entrance和相遇的节点)。那么此时slow指针共移动了 n+k 个节点,fast指针共移动了 2*(n+k) 个节点。则有 2*(n+k) = n + k + x*m,其中x表示此时fast指针已经在环中绕的圈数。由此可以得到 n+k=x*m,即 n = (x-1)*m + m - k。那么此时再将慢指针重新指向head,并且slow指针和fast指针均以同样的速度,每次移动一个节点位置往后移动,那么当slow指针走到entrance时,fast指针同样移动到了entrance节点。
代码如下:
LinkedListNode FindBeginning(LinkedListNode head) { if(head == null) return null; LinkedListNode n1 = head; LinkedListNode n2 = head; // 寻找快指针和慢指针相遇的节点位置 while (n2.next != null) { n1 = n1.next; n2 = n2.next.next; if (n1 == n2) { break; } } // 给定的链表没有换 if (n2.next == null) { return null; } //第二次遍历链表,定位环的入口 n1 = head; while (n1 != n2) { n1 = n1.next; n2 = n2.next; } return n2; }
- 寻找带环的单链表的换的入口位置处的节点
- 求带环的单链表入口位置处的节点
- 判断单链表是否带环,环的入口位置?
- 寻找有环单链表的入口节点
- 如何找到带环链表的入口节点?
- 带环单链表的环入口点
- 求带环单链表的入口点
- 判断单链表是否带环,若带环,求环的长度,求环的入口点
- 判断单链表是否带环? 若带环, 求环的长度? 求环的入口点?
- 判断单链表是否带环? 若带环, 求环的长度? 求环的入口点?
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?
- 判断单链表是否带环?若带环,求环的长度?求环的入口点?
- 判断单链表是否带环?若带环,求环的长度,求环的入口点
- 【C语言】找带环单链表的环入口
- 判断单链表是否带环?若带环,求环的入口点?
- 判断单链表是否带环,如果带环,求环的长度和入口结点
- 【算法】2013创新工场校园招聘笔试题--如何求出带环链表的入口节点
- 寻找单向链表中含有环的入口节点
- 项目报错六
- Collection集合之Set
- 语音知识回顾和总结----语音的介绍和读取语音文件
- Linux利用inotify-tools的inotifywait实现:当文件夹内容改变时自动执行一段脚本
- HDU 4706 Children's Day 解题报告
- 寻找带环的单链表的换的入口位置处的节点
- 驱动相关问题
- 字符串倒序
- 计词unigram和bigram的频次
- dev、devfs、 udev和sysfs之间的关系
- 数独 RUBY 算法、baltctf-2013-sudoku
- HIbernate中的乐观锁与悲观锁
- hdu 4710 Balls Rearrangement
- HDU 4708 Rotation Lock Puzzle 解题报告