您的位置:首页 > 其它

寻找单向循环链表的环的开始结点

2015-09-24 20:26 381 查看
struct node
{
int data;
node* next;
}


例如链表:

A -> B -> C -> D -> E -> C。

问题:给定一个循环链表,判断链表是否存在循环。

分析:本题的思路是设置两个指针P1,P2。

其中P1的速度为1,即每次走一个结点;P2的速度为2,即每次走两个结点。只要指针不为空,判断P1与P2是否相等,如果某次循环中P1==P2,则可以判断有循环。

当然如果传入的链表为null,则不存在循环不循环。所以返回false。

代码:

bool circle(node* head)
{

if (head == NULL)
return false;

bool flag = false;
node *p1=head, *p2=head;
while (p1 && p2)
{
if (p2)
p2 = p2->next;
if (p2)
p2 = p2->next;
else
return false;
if (p1)
p1 = p1->next;
else
return false;
if (p1==p2)
return true;

}
}


问题:给定一个循环链表,实现算法返回这个环的开始结点。

例如链表:

A -> B -> C -> D -> E -> C。

输出:C

分析:这个题其实是很多公司的面试题,不废话了,直接上思路。



代码:

node* circle(node* head)
{

if (head == NULL)
return false;

bool flag = false;
node *p1=head, *p2=head;
while (p1 && p2)
{
if (p2)
p2 = p2->next;
if (p2)
p2 = p2->next;
else
return NULL;
if (p1)
p1 = p1->next;
else
return NULL;
if (p1==p2)
break;
}
while (p1 && head)
{
p1 = p1->next;
head = head->next;
if (p1==head)
break;
}
return p1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: