用c语言写已知一个链表,计算并返回环形链表中环的长度,若无环返回0
时间: 2024-09-25 19:08:56 浏览: 71
c语言基础-c语言编程基础之链表操作示例-环形链表.zip
在C语言中,检测并计算环形链表的长度需要使用快慢指针(Floyd's Cycle Detection Algorithm)也称为龟兔赛跑算法。以下是基本步骤:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 判断链表是否有环
int hasCycle(ListNode* head) {
if (head == NULL || head->next == NULL) {
return 0; // 没有环
}
ListNode* slow = head;
ListNode* fast = head->next;
while (slow != fast) {
if (fast == NULL || fast->next == NULL) {
return 0; // 没有环
}
slow = slow->next;
fast = fast->next->next;
if (fast == slow) {
break; // 找到环了
}
}
return 1; // 如果到这里,说明存在环
}
// 计算环的长度
int getCircleLength(ListNode* head) {
if (!hasCycle(head)) {
return 0; // 环不存在,直接返回0
}
ListNode* slow = head;
ListNode* fast = head;
int length = 0;
while (fast != slow) {
fast = fast->next;
if (fast == NULL) {
fast = head; // 回到环起点
}
length++;
}
return length;
}
// 创建示例链表
ListNode* createLinkedList(int values[], int n) {
ListNode* head = NULL;
for (int i = 0; i < n; i++) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = values[i];
newNode->next = NULL;
if (i == 0) {
head = newNode;
} else {
ListNode* current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
}
return head;
}
int main() {
// 例如,给定链表 1->2->3->4->5->6->7 (循环点在6)
int values[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof(values) / sizeof(values[0]);
ListNode* head = createLinkedList(values, n);
// 检测环长并打印结果
int ringLength = getCircleLength(head);
printf("Ring length: %d\n", ringLength);
return 0;
}
```
这个程序首先检查链表是否包含环,然后找到环的入口,通过两个指针(一个每次移动一步,另一个每次移动两步),计算环的长度。
阅读全文