单链表判断有没有环
关键点:此处用快慢指针实现,如果链表无环,则最后一个节点的next必然为NULL,如果链表有环,则任何一个节点的next都不为NULL。
解决方案:用快慢指针,pre指针在next不为NULL时每次移动两个节点位置,即 pre=pre->next->next,behind指针每次移动一个节点位置,即 behind=behind->next。当两个指针移动速度不一样时,在有环的情况下,必然会有相等的时候。而在无环的时候,就是 pre 或 pre->next 为NULL的时候。
点击查看代码
#include <iostream>
using namespace std;
//博客园有时候不常看消息,有相关代码疑问的可以联系我,请注明来意,wx:A470216705
struct Node {
Node* next;
//int value;
};
bool has_ring(Node* head)
{
Node* pre = head;
Node* behind = head;
while (true)
{
if (pre->next != NULL)
pre = pre->next->next;
else
return false;
behind = behind->next;
if (pre == NULL)
return false;
if (pre == behind)
return true;
}
return false;
}
int main()
{
Node* head = new Node;
head->next = NULL;
Node* p1 = new Node;
head->next = p1;
Node* p2 = new Node;
p1->next = p2;
p2->next = NULL;
if (has_ring(head)) {
cout <<"有环"<<endl;
}
else
{
cout << "无环" << endl;
}
p2->next = head;
if (has_ring(head)) {
cout << "有环" << endl;
}
else
{
cout << "无环" << endl;
}
return 0;
}