题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnwzei/
1、快慢指针,快指针移动两次,慢指针移动一次,如果两指针相遇,表示链表有环。就像钟表一样,秒针和分针总会指在同一个地方。只要快指针比慢指针快,链表中存在环,两个指针就会相遇。
main函数代码:
#include<stdio.h>
#include<stdlib.h>
bool hasCycle(struct ListNode *head);
struct ListNode {
int val;
struct ListNode *next;
};
int main(){
// 动态申请空间初始化
struct ListNode *lnode1 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode2 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode3 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode4 = (struct ListNode *)malloc(sizeof(struct ListNode));
struct ListNode *lnode5 = (struct ListNode *)malloc(sizeof(struct ListNode));
lnode1->val = 1;
lnode2->val = 2;
lnode3->val = 3;
lnode4->val = 4;
lnode5->val = 5;
lnode1->next = lnode2;
lnode2->next = lnode3;
lnode3->next = lnode4;
lnode4->next = lnode5;
lnode5->next = lnode2;
bool isTrue = hasCycle(lnode1);
printf("%d",isTrue);
return 0;
}
判断是否有环代码:
bool hasCycle(struct ListNode *head) {
// 快指针
struct ListNode *p = head;
// 慢指针
struct ListNode *q = head;
// 快指针走两步,判断p->next是为了防止p->next为空,p->next->next出错
while(p!=NULL&&p->next!=NULL){
// 走两步
p = p->next->next;
// 走一步
q = q->next;
// 相遇表示有环
if(p==q){
return true;
}
}
return false;
}