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;
}