给定一个有限链表,判断链表中是否有环。 所谓的环 不一定是是最后的指向第一个节点, 也可能是指向中间的节点
/*
快慢指针 判断是否是循环链表
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct LinkedList {
int num;
struct LinkedList *next;
}LinkedList;
LinkedList *newNode(int num){
LinkedList *node;
node = (LinkedList *)malloc(sizeof(LinkedList));
// 下个节点赋值 设定当前节点的下个节点
node->num = num;
node->next = NULL;
return node;
}
// 创建一个非循环链表
LinkedList *initSortStruct(int length){
LinkedList *current, *node, *headNode;
for (int i = 1; i <= length; i++){
if(i == 1){
headNode = newNode(i);
node = headNode;
}else{
current = newNode(i);
node->next = current;
// 重置当前节点
node = current;
}
}
// 将最后节点的头节点指向空节点
current->next = NULL;
return headNode;
}
// 快慢指针
int quickSlowPoint(LinkedList *X){
LinkedList *headNode, *Y;
headNode = X;
Y = X;
// 只要指向空节点 那么 就会退出循环
while(X != NULL || Y != NULL ){
if(X->next == NULL){
return 0;
}
X = X->next;
if(Y->next == NULL || Y->next->next == NULL){
return 0;
}
Y = Y->next->next;
if(X == Y){
printf("该链表是循环链表\n");
return 1;
}
}
return 0;
}
int main(int argc, char const *argv[]){
LinkedList *list;
int length = 44; // 初始化人数 为 44
int result;
list = initSortStruct(length);
result = quickSlowPoint(list);
if(result == 0){
printf("该链表是非循环链表\n");
}
return 0;
}