判断单链表是否成环

学习数据结构的链表,课上提出了一个问题:如何判断一个单链表是否成环?基于上次学习的快慢指针算法,可以给出一种快速判断的方法:仍然采用快慢指针,当单链表成环状的时候,快慢两个指针一定会相遇(追击问题,操场上落后的你一定会再次与朋友相遇,只要你跑的足够慢!!)

//判断单链表里面是否有环?
//1.生成一个单链表,然后人为的成环
//2.用两种方法判断单链表里面是否存在环?

#include<iostream>
using namespace std;

//定义结点
struct ListNode
{
   
    int val;
    ListNode* next;
    ListNode() : val(), next() {
   } //
    ListNode(int x) : val(x), next(NULL) {
   } //
};
//生成单链表,数据初始化为1,2,3...,尾节点指向第三个结点
ListNode *GenerateList(int num)
{
   
    ListNode* head=new ListNode(1);
    ListNode* curNode=head;
    for(int i=1;i<num;++i)
    {
   
        curNode->next=new ListNode(i+1);
        curNode=curNode->next;
    }
    curNode->next=head->next->next;
    return head;
}
//判断是否存在环,用快慢指针
bool ifloop(ListNode* head)
{
   
    ListNode* fast=head;
    ListNode* slow=head;
    while(fast->next)
    {
   
        if(fast->next->next)
        {
   
            fast=fast->next->next;
            slow=slow->next;
        }
        else 
        {
   
            fast=fast->next;
            slow=slow->next;
        }
        if(fast==slow)
        return true;

    }
    return false;

}


int main()
{
   
    cout<<"输入单链表长度";
    int num;
    cin >>num;
    ListNode* ListA=GenerateList(num);
    cout<<ifloop(ListA);
    return 0;
}

程序运行结果

**

记住链表创建完毕后,不要手欠打印出来,不信你试试!!

**

刷题总结类 文章被收录于专栏

这里记录一些刷题时候的总结思考

全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务