目录
题目
单链表有环,是指单链表的最后一个结点指向了链表中的某个结点(通常单链表的最后一个结点的指针域是空的)。试编写算法判断单链表是否存在环。
思路提示
本次代码借用了龟兔赛跑的原理。乌龟跑的慢每次只跑一步,兔子跑的快一些每次跑两步。如果没有环的话则兔子一定先比乌龟到达终点,否则,乌龟和兔子在环中的某个位置必然相遇。
如何判断链表是否有环之龟兔赛跑新解_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1EE411j7K8/?spm_id_from=333.337.search-card.all.click&vd_source=286ad9be10f644ddf66f9498659066ee该视频很好的解释了在环状路线中乌龟为什么能追上兔子的思想,可供参考。
核心代码
//判断是否有环
int hasCycle(Node* head){
Node* slow=head;
Node* fast=head;
while(fast!=NULL&&fast->next!=NULL){
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
return 1;
}
}
return 0;
}
完整代码
//判断单链表是否存在环
#include<stdio.h>
#include<stdlib.h>
//定义链表节点
typedef struct Node{
int data;
struct Node* next;
}Node;
//创建新节点
Node* createNode(int data){
Node* newNode=(Node*)malloc(sizeof(Node));
newNode->data=data;
newNode->next=NULL;
return newNode;
}
//判断是否有环
int hasCycle(Node* head){
Node* slow=head;
Node* fast=head;
while(fast!=NULL&&fast->next!=NULL){
slow=slow->next;
fast=fast->next->next;
if(slow==fast){
return 1;
}
}
return 0;
}
int main(){
//创建一个有环的链表
Node* head=createNode(1);
head->next=createNode(2);
head->next->next=createNode(3);
head->next->next->next=head->next;//创建环
if(hasCycle(head)){
printf("链表中存在环。\n");
}else{
printf("链表中不存在环。\n");
}
return 0;
}
示例
链表中存在环。