[转]给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点
2012-12-07 16:28
225 查看
转自:http://blog.csdn.net/dengsi23/article/details/7984291
判断单向链表是否有环,可以采用快指针与慢指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个节点。在fast与slow第一次相遇后,设置一个节点pNode从链表的头部开始遍历,每次只遍历一个节点。这样,当fast与slow再次相遇时,pNode所处的位置便是环的首部。以下该问题的实现源码(C语言描述):
EOF
判断单向链表是否有环,可以采用快指针与慢指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个节点。在fast与slow第一次相遇后,设置一个节点pNode从链表的头部开始遍历,每次只遍历一个节点。这样,当fast与slow再次相遇时,pNode所处的位置便是环的首部。以下该问题的实现源码(C语言描述):
LNode* GetLoopNode(LNode* head) { //前置条件的判断 if (!head) { return NULL; } //定义一个快指针和一个慢指针 LNode* fast = head; LNode* slow = head; while (fast && (fast->next)) { fast = fast->next->next; slow = slow->next; if (fast == slow) { //如果有环,则返回环的第一个节点 slow = head; while (1) { fast = fast->next; slow = slow->next; if (fast == slow) { break; } } return slow; } } return NULL; }
EOF
相关文章推荐
- 给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点
- 给定单链表(head),如果有环的话请返回从头结点进入环的第一个节点
- 如何判断单链表是否有环,如果有怎么找到进入环的节点
- 判断一个单链表是否有环,若有环,求进入环中的第一个节点
- 给定单链表,检测是否有环等系列考题
- 给定单链表,检测是否有环等系列考题
- 开心IT面试题: 给定单链表,检测是否有环
- 判断单链表是否有环 并找出第一个相交的节点
- 判断单链表是否有环 并找出第一个相交的节点
- 合并链表,判断链表是否有环、是否相交,相交的第一个节点,进入环的第一个节点,O(1)时间复杂度删除某节点
- 数据结构 - 如何判断两个无环单链表是否相交;如果相交,给出相交的第一个结点
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- 给定一个单链表,从链表返回一个随机节点的值。 每个节点必须具有相同的选择概率。 跟进: 如果这个链表非常大,而且它的长度不为人知呢? 你能解决这个问题,而不使用额外的空间?
- 7.微软亚院之编程判断俩个链表是否相交(如果需要求出俩个链表相交的第一个节点)
- 数据结构 - 如何判断两个无环单链表是否相交;如果相交,给出相交的第一个结点
- 判断链表是否有环,如果有返回入环的第一个节点。
- 判断两个单链表是否相交同时找出第一个相交点(单链表是否有环及寻找入口节点)
- 如果检测指定的Windows服务是否启动
- 判断两个单链表是否相交及找到第一个交点
- 转:判断两个单向链表是否相交,并找到两个单向链表的第一个相交节点