您的位置:首页 > 其它

[转]给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点

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语言描述):

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐