判断链表有环,有几种方法:最简单的就是设定两个指针ptr1,ptr2,ptr1每次走一步,ptr2每次走两步;如果没有环,那么ptr2是和ptr1永远不可能相等的;如果ptr1 == ptr2,那么这个链表肯定有环。 # include <stdio.h> # include <malloc.h> typedef struct LNode{ int data; struct LNode *next; }LNode, *LinkList; /** * 采用数组a[]来初始化链表,数组的长度为length;head指向了头节点。 */ LinkList CreatList(int a[], int length) { LinkList head = (LinkList)malloc(sizeof(LNode)); head->next = NULL; int index; LinkList temp; for (index = 0; index < length; index ++) { temp = (LinkList)malloc(sizeof(LNode)); temp->data = a[index]; temp->next = head->next; head->next = temp; } return head; } /** * 判断是否有环 */ int isLoop(LinkList list) { LinkList current = list->next; LinkList ptr1 = current; LinkList ptr2 = current; //此函数有两个出口:一个是ptr2 == null,此时说明链表没有环; while (ptr2 != NULL) { ptr1 = ptr1->next; // ptr2 = ptr2->next->next; // if (ptr1 == ptr2) //函数第二个出口,说明链表有环; // return 1; ptr2 = ptr2->next; //多做一次判断,防止出现空指针异常 if (ptr2 == NULL) //没有环; return 0; else ptr2 = ptr2->next; if (ptr1 == ptr2) return 1; } return 0; } int main() {int a5[] = {1,2,3,4,5}; int result2 = isLoop(CreatList(a5,5)); result2 > 0? printf("has loop/n"):printf("no loop/n"); return 0; }