📜  用于在链表中查找循环长度的 C++ 程序(1)

📅  最后修改于: 2023-12-03 15:27:10.778000             🧑  作者: Mango

用于在链表中查找循环长度的 C++ 程序

这是一份用于查找链表中循环长度的 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;
参考文献
结语

本程序为求解链表中循环长度提供了一种高效的算法,希望对有需求的程序员有所帮助。