链表环的判断

 1 #include <iostream>
 2 using namespace std;
 3 struct Listnode//定义链表节点 
 4 {
 5     int val;
 6     Listnode* next;
 7     Listnode(int _val):val(_val),next(nullptr){}
 8 } ;
 9 //判断链表是否成环
10 bool cycle(Listnode* head)
11 {
12     Listnode* fast=head;
13     Listnode* slow=head;
14     while(fast!=nullptr && fast->next!=nullptr)
15     {
16         slow=slow->next;
17         fast=fast->next->next;
18         if(slow==fast)
19         {
20             
21             return true;
22         }
23     }
24     return false;
25 } 
26 //判断链表是否存环,存在返回环开始的节点
27 Listnode* cycle_pos(Listnode* head)
28 {
29     Listnode* slow=head;
30     Listnode* fast=head;
31     while(fast!=nullptr && fast->next!=nullptr)
32     {
33         slow=slow->next;
34         fast=fast->next->next;
35         if(slow==fast)
36         {
37             Listnode* index1=fast;
38             Listnode* index2=head;
39             while(index1!=index2)
40             {
41                 index1=index1->next;
42                 index2=index2->next;
43             }
44             return index1;
45         }
46     }
47     return nullptr;
48 } 
49 int main(int argc, char *argv[])
50 {
51     Listnode* n1=new Listnode(3);
52     Listnode* n2=new Listnode(2);
53     Listnode* n3=new Listnode(0);
54     Listnode* n4=new Listnode(-4);
55     n1->next=n2;
56     n2->next=n3;
57     n3->next=n4;
58     n4->next=n2;
59     cout<<n1->val<<" "<<n2->val<<" "<<n3->val<<" "<<n4->val;
60     bool result=cycle(n1);
61     auto f=[=]{return result?"cycle":"no cycle";};
62     cout<<f()<<endl;//是否成员 
63     Listnode* node=cycle_pos(n1);
64     //auto g=[=]{return node?"cycle":"no cycle";};
65     //cout<<g()<<endl;
66     if(node)
67     {
68         cout<<"cycle start is:"<<node->val<<endl;
69     }
70     else{
71         cout<<"no cycle"<<endl;
72     }
73     
74     return 0;
75 }

 

posted @ 2022-01-07 22:31  菠萝超级酸  阅读(37)  评论(0编辑  收藏  举报