判断单链表是否成环

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

//判断单链表里面是否有环?
//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;
}

程序运行结果
在这里插入图片描述
**

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

**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值