学习数据结构的链表,课上提出了一个问题:如何判断一个单链表是否成环?基于上次学习的快慢指针算法,可以给出一种快速判断的方法:仍然采用快慢指针,当单链表成环状的时候,快慢两个指针一定会相遇(追击问题,操场上落后的你一定会再次与朋友相遇,只要你跑的足够慢!!)
//判断单链表里面是否有环?
//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;
}
程序运行结果
**
记住链表创建完毕后,不要手欠打印出来,不信你试试!!
**