C语言链表判断是否有环:快慢指针方法
要判断链表是否有环,可以使用快慢指针的方法。\n\n首先,定义两个指针,一个快指针(fast)每次移动两步,一个慢指针(slow)每次移动一步。\n\n然后,遍历链表,每次移动指针,如果链表中存在环,那么快指针(fast)最终会追上慢指针(slow),即fast == slow;如果链表中不存在环,那么快指针最终会到达链表的尾部,即fast == NULL 或 fast->next == NULL。\n\n以下是用C语言实现的代码:\n\nc\n#include <stdbool.h>\n\n// 链表节点的定义\nstruct ListNode {\n int val;\n struct ListNode *next;\n};\n\nboolean hasCycle(struct ListNode *head) {\n if (head == NULL || head->next == NULL) {\n return false;\n }\n \n struct ListNode *fast = head;\n struct ListNode *slow = head;\n \n while (fast != NULL && fast->next != NULL) {\n fast = fast->next->next;\n slow = slow->next;\n \n if (fast == slow) {\n return true;\n }\n }\n \n return false;\n}\n\n\n在主函数中,你可以创建一个有环或者无环的链表进行测试。例如:\n\nc\nint main() {\n // 创建一个有环的链表\n struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));\n struct ListNode *node1 = (struct ListNode*)malloc(sizeof(struct ListNode));\n struct ListNode *node2 = (struct ListNode*)malloc(sizeof(struct ListNode));\n struct ListNode *node3 = (struct ListNode*)malloc(sizeof(struct ListNode));\n struct ListNode *node4 = (struct ListNode*)malloc(sizeof(struct ListNode));\n \n head->val = 1;\n head->next = node1;\n \n node1->val = 2;\n node1->next = node2;\n \n node2->val = 3;\n node2->next = node3;\n \n node3->val = 4;\n node3->next = node4;\n \n node4->val = 5;\n node4->next = head; // 最后一个节点指向头节点,形成环\n \n bool hasCycle = hasCycle(head);\n if (hasCycle) {\n printf("链表有环\n");\n } else {\n printf("链表无环\n");\n }\n \n // 释放内存\n free(node4);\n free(node3);\n free(node2);\n free(node1);\n free(head);\n \n return 0;\n}\n\n\n这样,就可以判断链表是否有环了。
原文地址: https://www.cveoy.top/t/topic/pSlK 著作权归作者所有。请勿转载和采集!