📅  最后修改于: 2023-12-03 15:27:10.778000             🧑  作者: Mango
这是一份用于查找链表中循环长度的 C++ 程序。在使用本程序前,需要先理解链表和循环链表的概念。
本程序的功能是查找循环链表中的循环节长度。
本程序实现了 Floyd 算法,也称 Hare and Tortoise 算法。这个算法通过两个指针来遍历链表,一个指针比另一个指针快,如果链表存在循环,那么两个指针最终会相遇。
具体而言,程序先使用两个指针分别从链表的头结点出发,快指针每次向后移动两个结点,慢指针每次向后移动一个结点。如果链表存在循环,那么快指针最终会追上慢指针,两个指针会相遇,此时就可推出循环首次出现的位置。
接下来,程序使用两个指针分别从循环首次出现的位置和相遇位置出发,每次向后移动一个结点,直到它们再次相遇。此时,同样可以推出循环的长度。
以下是程序的核心代码片段。
#include <iostream>
using namespace std;
class node {
public:
int val;
node* next;
node(int val): val(val), next(nullptr) {}
};
int findCycleLen(node* head) {
if (!head || !head->next) return 0;
node *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
int len = 0;
do {
len++;
fast = fast->next;
} while (fast != slow);
slow = head, fast = head;
while (len--) fast = fast->next;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return len;
}
}
return 0;
}
int main() {
node *head = new node(1);
head->next = new node(2);
head->next->next = new node(3);
head->next->next->next = new node(4);
head->next->next->next->next = head->next;
cout << findCycleLen(head) << endl; // 输出:3
return 0;
}
为了测试本程序,需要先构建一个循环链表。具体构建过程视情况而定,这里不再赘述。
调用本函数,只需要传入链表的头结点即可。
int len = findCycleLen(head);
cout << "循环的长度为:" << len << endl;
本程序为求解链表中循环长度提供了一种高效的算法,希望对有需求的程序员有所帮助。