判断链表是否有环,采用快慢指针相关思想,若无环则不会相遇
pLinkNode Check_Loop(pLinkList plist) //快慢指针类似方法,若链表带环则会相遇
{
assert(plist);
pLinkNode fast = plist->_pHead;
pLinkNode slow = plist->_pHead;
/*fast = plist->_pHead;
slow = plist->_pHead;*/
while (fast->next &&fast)
{
fast = fast->next->next;
slow = slow->next;
if (slow == fast)
return slow;
}
return NULL;
}
求环长度
int Loop_Len(pLinkList plist) //求环长度,从之前快慢指针相遇节点往后走当相遇时即走了一个环
{
pLinkNode cur = Check_Loop(plist);
int count = 1;
while (cur->next != Check_Loop(plist))
{
cur = cur->next;
count++;
}
return count;
}
链表入口
pLinkNode Loop_en(pLinkList plist) //找链表的环入口
{
pLinkNode cur = plist->_pHead ;
pLinkNode meet = Check_Loop(plist);
while (cur != meet)
{
cur = cur->next;
meet = meet->next;
}
return cur;
}
测试代码
void test8()
{
LinkList p1;
pLinkNode cur = NULL;
Init_LinkList(&p1);
Push_Back(&p1, 1);
Push_Back(&p1, 3);
Push_Back(&p1, 4);
Push_Back(&p1, 0);
Push_Back(&p1, 2);
Push_Back(&p1, 6);
Push_Back(&p1, 7);
Find_NUM(&p1, 7)->next = Find_NUM(&p1, 2);
/*Print_LinkList(&p1);
if (Check_Loop(&p1) == NULL)
printf("链表无环");
else
printf("链表有环");*/
//printf("%d", Loop_Len(&p1));
printf("%d", Loop_en(&p1)->_data );
}
int main()
{
//test1();
//test2();
//test3();
//test5();
//test6();
//test7();
test8();
getchar();
return 0;
}