链表面试题之带环问题
2016-06-20
typedef int DataType;
typedef struct LinkNode
{
DataType data;
struct LinkNode *next;
}LinkNode,*pLinkNode;
typedef struct LinkList
{
LinkNode *phead;
}LinkList,*pLinkList; pLinkNode Check_Cycle(pLinkList plist) //判断链表是否带环,若带环则返回相遇点
{
pLinkNode fast=NULL;
pLinkNode slow=NULL;
assert(plist);
fast=plist->phead;
slow=plist->phead;
while(fast && fast->next)
{
fast=fast->next->next;
slow=slow->next;
if(fast == slow)
{
return fast;
}
}
return NULL;
}int Get_CircleLength(pLinkNode meet) //求环的长度
{
int count=1;
pLinkNode cur=meet;
pLinkNode pmeet=meet;
while(cur->next != pmeet)
{
count++;
cur=cur->next;
}
return count;
}pLinkNode GetCircle_EntryNode(pLinkList plist,pLinkNode meet) //获取环的入口点
{
pLinkNode front=plist->phead;
pLinkNode back=meet;
assert(plist);
while(front != back)
{
front=front->next;
back=back->next;
}
return front;
}void text7()
{
int ptr=0;
pLinkNode ret=NULL;
pLinkNode meet=NULL;
LinkList plist;
Init_LinkList(&plist);
Push_back(&plist,1);
Push_back(&plist,2);
Push_back(&plist,3);
Push_back(&plist,4);
Push_back(&plist,5);
ret=Find_NUM(&plist,5); //构造环
ret->next=Find_NUM(&plist,3);
meet=Check_Cycle(&plist);
if(meet != NULL)
{
printf("带环链表的相遇结点为:%d\n",meet->data);
ptr=Get_CircleLength(meet);
printf("带环链表的环的长度为:%d\n",ptr);
ret=GetCircle_EntryNode(&plist,meet);
printf("带环链表的环的入口点为:%d\n",ret->data);
}
Free_LinkList(&plist);
}
int main()
{
text7();
system("pause");
return 0;
}