C语言 快慢指针 判断是否是环形的链表

给定一个有限链表,判断链表中是否有环。 所谓的环 不一定是是最后的指向第一个节点, 也可能是指向中间的节点

 

/*
  快慢指针 判断是否是循环链表
*/

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章