码迷,mamicode.com
首页 > 其他好文 > 详细

返回环路的开头结点

时间:2015-08-18 22:42:39      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

技术分享给定一个有环链表,实现一个算法返回环路的开头结点。


技术分享技术分享技术分享技术分享技术分享

#include<iostream>
using namespace std;


typedef struct node
{
int data;
struct node* next;
}* LinkedListNode;
LinkedListNode FindBeginning(LinkedListNode head)
{
LinkedListNode slow = head;
LinkedListNode fast = head;
//找出碰撞处,将处于链表LOOP_SIZE-k步的位置
while (fast != NULL && fast->next != NULL)
{
slow = slow->next;
fast = fast->next->next;
if (slow == fast)//碰撞
{
break;
}
}
//错误检查,没有碰撞处,也即没有环路
if (fast == NULL || fast->next == NULL)
{
return NULL;
}
//将slow指向首部,fast指向碰撞处,两者距离环路起始处k步,
//若两者以相同速度前进,则必定会在环路起始位置碰撞在一起
slow = head;
while (slow != fast)
{
slow = slow->next;
fast = fast->next;
}
//至此两者均指向环路起始处
return fast;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

返回环路的开头结点

标签:

原文地址:http://blog.csdn.net/wangfengfan1/article/details/47760885

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!