使用两个指针,一快一慢向前试探,如果最终重合则链表有环 #include <stdio.h> typedef struct list { int data; struct list *next; } LIST; int check_circle_2(LIST *head) { LIST *p, *q; p = head; if (p == NULL) return 0; q = p->next; while (p != NULL && q != NULL) { if (p == q) { return 1; } p = p->next; if (q->next == NULL) { return 0; } else { q = q->next->next; } } return 0; } int main() { LIST a, b, c,d, *head = &a; a.next = &b; b.next = &c; c.next = &d; d.next = &b; printf("%d/n", check_circle_2(head)); }