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