• 【C++】链表回环检测


    //链表回环检测问题 
    #include<iostream>
    #include<cstdlib> 
    using namespace std;
    const int M=1024;
    
    struct node
    {
        int data;
        node *next;
    };
    
    node *test1=new node();
    node *test2=new node();//1->ring;2->no ring
    node* vis[M];
    
    bool test_ring(const node *head)
    {
        node *p=head->next;
        int i=0;
        while(p)
        {
            for(int j=0;j<i;j++)
            {
                if(vis[j]==p&&vis[j]!=NULL)
                    return true;
            }
            vis[i]=p;
            p=p->next;
            i++;
            //cout<<vis[0]<<endl;
        }
        return false;
    }
    
    bool advanced_test(const node *head)
    {
        node *slow=head->next;
        node *fast=slow;
        while(fast!=NULL&&fast->next!=NULL)
        {
            slow=slow->next;
            fast=fast->next->next;
            if(fast==slow)
            {
                return true;
            }
        }
        return false;
    }
    
    int main()
    {
        node *p=test1;
        node *tag;//环切入点 
        for(int i=1;i<=5;i++)
        {
            node *t=new node;
            t->data=i*2;
            if(i==2)
                tag=t;
            p->next=t;
            p=p->next;
            p->next=NULL;
        }
        p->next=tag;
        /*
        p=test1->next;
        while(p)
        {
            cout<<p->data<<endl;
            p=p->next;
        }
        */
        p=test2;
        for(int i=1;i<=5;i++)
        {
            node *t=new node;
            t->data=i*2;
            p->next=t;
            p=p->next;
            p->next=NULL;
        }
        /*
        p=test2->next;
        while(p)
        {
            cout<<p->data<<endl;
            p=p->next;
        }
        */
        for(int i=0;i<M;i++)
            vis[i]=NULL;
            
        cout<<"normal test:"<<endl;
        if(test_ring(test1))
            cout<<"ring!"<<endl;
        else
            cout<<"no ring!"<<endl;
        if(test_ring(test2))
            cout<<"ring!"<<endl;
        else
            cout<<"no ring!"<<endl;
            
        cout<<"advanced test:"<<endl;
        if(advanced_test(test1))
            cout<<"ring!"<<endl;
        else
            cout<<"no ring!"<<endl;
        if(advanced_test(test2))
            cout<<"ring!"<<endl;
        else
            cout<<"no ring!"<<endl;
        
        
        return 0;
    }

    tz@HZAU

    2019/3/14

  • 相关阅读:
    小程序返回顶部top滚动
    创建对象的几种模式
    前端基础常识
    三行代码让页面中的所有元素增添不同颜色的外边框
    纯css制作小三角
    设计表单
    纯css制作三级菜单
    三栏-中栏流动布局
    三栏固定布局(为栏设定内边距和边框)
    ie8以下不兼容h5新标签的解决方法
  • 原文地址:https://www.cnblogs.com/acm-icpcer/p/10533289.html
Copyright © 2020-2023  润新知