课程【 判断链表是否有环】

来源:互联网 发布:单片机 工作过程 编辑:程序博客网 时间:2024/06/11 21:25

  •  1000ms
  •  65536K

有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。

输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。

n存在四种情形:
①为-1,代表该结点的指针域指向NULL,输入结束;
②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;
③指向自己,如第3个结点的指针域指向n = 3的结点;
④指向其直接后继结点,如第3个结点的指针域指向n = 4的结点,不能指向n = 5的结点。


当输入为:
1 2
2 3
3 -1
时,代表:第1个结点的数据为1,指向第2个结点;第2个结点的数据为2,指向第3个结点;第3个结点的数据为3,指向NULL,输入结束。

样例输入

1 23 34 25 -1

样例输出

true


先记录每一个结点-.-

从每一个可能是头结点的结点开始进行链表下移-.-

当循环次数超过n时-.-就是发现了链表中有环了




代码:

#include<cstring>#include<iostream>using namespace std;struct List{    int hao;    List * next;}dian[10010];int main(){    bool fafe=false;    int i=1,a,b,h[10010];    memset(h,0,sizeof(h));    int shu[10010]={0};    List * head=NULL;    List * p=new List();    while (cin>>a>>b)    {        dian[i].hao=i;        if (b==-1)        dian[i].next=NULL;        else        dian[i].next=&dian[b];        i++;        h[b]++;    }    int n=i-1;    for (i=1;i<=n;i++)    {        if (!h[i])        {            int lp=0;            head=&dian[i];            while (head->next)            {                lp++;                head=head->next;                if (lp>n)                {                    fafe=true;                    break;                }            }        }        if (fafe) break;    }    if (fafe)        cout<<"true"<<endl;    else        cout<<"false"<<endl;    return 0;}


0 0
原创粉丝点击