一、判断链表是否有环
解题思路:定义两个指针,一个快指针,一个慢指针,快指针走两步,慢指针走一步,当快指针和慢指针指向同一个节点时,就确定有环,如果快指针和慢指针不会指向同一个节点就说明不是带环链表
typrdef struct Node
{
int data;
Node * next;
}PNode;
PNode * Hascircle(PNode * head)
{
PNode * s = head;
PNode * f = head;
while(s && f)
{
s = s ->next;
f = f->next->next;
if(s == f)
{
return s;
}
}
return NULL;
}
二、判断链表环的长度
解题思路:定义一个指针,让它从慢指针指向的节点处出发,每向后一个节点len就加一,直到该指针和慢指针指向同一个节点
int Length(PNode * head)
{
PNode * p = Hascircle(head);
PNode * q = NULL;
int len = 0;
if(p == NULL)
{
return NULL;
}
q = p;
while(q->next != p)
{
++len;
q = q->next;
}
return len;
}
三、环形链表的入口
解题思路:若链表是带有环的链表,则它的头结点到它的入口和相遇点到它的入口距离相等,下面指针p为头,q为相遇点
PNode * EntryCircle(PNode * p,PNode * q)
{
if(p == NULL || q == NULL)
{
return NULL;
}
while(p != q)
{
p = p->next;
q = q->next;
}
return q;
}