注册 登录
编程论坛 C++教室

判断链表是否有环

lmq14 发布于 2014-11-13 15:55, 659 次点击
有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。
输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。
n存在四种情形:
①为-1,代表该结点的指针域指向NULL,输入结束;
②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;
③指向自己,如第3个结点的指针域指向n = 3的结点;
④指向其直接后继结点,如第3个结点的指针域指向n = 4的结点,不能指向n = 5的结点
PS:本人大一学生,想早点学完C++,但时间不够也没有经验,往往碰上一个难题就要想很久,希望大家不吝赐教
判断是否有环的一般方法知道了,但我不知道怎么构造这个链表,m该怎么理解,难道是第几个结点
而且n的多种情况该如何处理
下面是我的尝试
#include<iostream>
using namespace std;
struct List
{
    int num;
    List *next;
};
List *head=NULL;
void Create(){
    List *p=NULL, *q=NULL, *r=NULL;
    int m, n, x=0;
    p=new List;
    cin>>p->num>>n;
    x++;
    head=p;
    head->next=NULL;
    q=p;
    while(n!=-1){
        if(n==x-1){
            r=head;
            while(r->next!=q)
                r=r->next;
            q->next=r;   
        }
        if(n==x){
            q->next=q;
        }
        int g=0;
        if(n==x+1){
            p=new List;
            cin>>p->num>>n;
        x++;
            q->next=p;
            q=p;
        }
    }
    q->next=NULL;
}
bool circle(){
    if(head==NULL)
        return false;
    if((head!=NULL)&&(head->next==NULL))
        return false;
    if((head!=NULL)&&(head->next==head))
        return true;
    List *p=head;
    List *q=head->next;
    while((p->next!=NULL)&&(q->next!=NULL)&&(p!=q)){
        p=p->next;
        q=q->next->next;
    }
    if(p==q)return true;
    return false;
}
int main()
{
    Create();
    if(circle())cout<<"true";
    else cout<<"false";
    return 0;
}
样例输入
1 2
3 3
4 2
5 -1
样例输出
true
2 回复
#2
rjsp2014-11-14 08:46
对于
m1 n1
m2 n2
m3 n3
……
mi -1
这样的输入而言,若 n1,n2,n3……,-1 不是 2,3,4,……,-1,那就是存在环
#3
lmq142014-11-14 13:21
回复 2 楼 rjsp
那我如果要按要求构造链表怎么弄,能逐个构造节点吗,还是要先定义一个动态数组存着结点指针
1