要判断一个单链表是否有环结构,可以考虑以下几个问题:
给定一个单链表,只给出头指针head:
1、如何判断是否存在环?
2、如何知道环的长度?
3、如何找出环的连接点在哪里?
4、带环链表的长度是多少?
int hasloop(Link head)
{
int i = 0;
if(head->next == NULL)
{
return 0;
}
Link tail = head->next;
Link front = NULL;
while(tail->next != NULL)
{
i = 0;
front = tail;
while(front->next != NULL && front->next != tail)
{
i++;
front = front->next;
if(i > 99)
{
break;
}
}
if(front->next == tail)
{
while(tail != front)
{
printf("%d ",tail->num);
tail = tail->next;
}
return i;
}
tail = tail->next;
}
return 0;
}
以上是我写的程序,其中有不合理的地方,因为如果tail结点不在环内而链表确实有环,就会出现front指针一直在环内循环,设计的循环不会结束,所以加了一条限制无限循环的语句,即i>99时退出循环,如果有环,虽然i无限加,证明了确实有环结构但是找不到环的起点,以及环的长度,所以就加上这一条,但也仅限于环长度不足99的情况。这是个bug。
以及主程序中需要设计出这样一个环,设计验证完成后还不要忘了将环还原否则环后的空间是否不掉。恩,程序猿的基本素养嘿嘿嘿。
int tst = 4;
Link p = head->next;
Link q = p;
while(tst!=0)
{
q = q->next;
tst--;
}
Link r = q->next;
q->next = p;
int loop = hasloop(head);
printf("\n%d\n",loop);
q->next = r;
其中tst是选择环的大小,指针p是选择环起点,r是记录环后第一个结点,方便验证结束后指针重新归位。
然后是验证: