题目:判断一个链表是否有环
思路:快慢指针
bool hasCycle(LinkList& L){
ListNode* fast = L;
ListNode* slow = L;
while(fast != NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
//快慢指针相遇,说明有环
if(slow == fast) return true;
}
return false;
}
全部代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct node{
int val;
struct node* next;
}ListNode,*LinkList;
bool hasCycle(LinkList& L){
ListNode* fast = L;
ListNode* slow = L;
while(fast != NULL && fast->next != NULL){
slow = slow->next;
fast = fast->next->next;
//快慢指针相遇,说明有环
if(slow == fast) return true;
}
return false;
}
//尾插法
ListNode* createListR(int finish){ //约定以finish结束
int x;
cin >> x;
if(x == finish) return NULL; //递归边界
ListNode* p = new ListNode;
p->val = x;
p->next = createListR(finish); //把剩余的创建任务交给下一层
return p;
}
int main(){
ListNode* p = createListR(9999);
//判断是否有环
cout<<hasCycle(p)<<endl;
ListNode* k;
for(k = p; k->next != NULL; k = k->next);
k->next = p->next;
//制造一个局部环再判断是否有环
cout<<hasCycle(p)<<endl;
}
运行结果:
更多代码请参考:手撕考研数据结构(代码汇总)