C 判断单链表是否有环

来源:互联网 发布:程序员刚入职啥也不会 编辑:程序博客网 时间:2024/06/05 03:55

要判断一个单链表是否有环结构,可以考虑以下几个问题:

给定一个单链表,只给出头指针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是记录环后第一个结点,方便验证结束后指针重新归位。

然后是验证:


0 0
原创粉丝点击