C++程序 在链表中找到循环的长度

C++程序 在链表中找到循环的长度

在链表中,循环是指链表中的某个节点指向链表中已经出现过的节点,使得链表像一个环一样。如果我们想要在链表中找到循环的长度,我们可以使用Floyd循环算法来解决这个问题。Floyd循环算法也称作龟兔赛跑算法,它可以找到链表中的循环,并且得到循环的长度。

本文将会用C++语言,通过给出示例代码和解释,来阐述如何使用Floyd循环算法来解决这个问题。

什么是链表?

链表是指一种动态数据结构,它由若干个节点组成。每个节点都包含了数据以及指向下一个节点的指针。链表的最后一个节点指向NULL,这个NULL指针表示链表的结束。

链表可以有两种类型:单向链表和双向链表。单向链表的每个节点只包含一个指针,指向下一个节点。而双向链表的每个节点包含两个指针,分别指向前一个节点和下一个节点。

链表的优点在于,它可以动态地分配内存,插入和删除节点的操作非常容易。而且链表可以非常有效地存储大量的数据。

以下是一个单向链表的代码示例:

#include <iostream>

using namespace std;

struct ListNode {
    int val;        // 节点的值
    ListNode* next; // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
    // 创建一个长度为5的链表
    ListNode *head = new ListNode(1);
    ListNode *p = head;
    for (int i = 2; i <= 5; i++) {
        p->next = new ListNode(i);
        p = p->next;
    }
    // 输出链表的值
    p = head;
    while (p != NULL) {
        cout << p->val << " ";
        p = p->next;
    }
    cout << endl;
    return 0;
}

输出结果为:1 2 3 4 5

什么是链表的循环?

链表的循环是指链表中的某个节点指向链表中已经出现过的节点,使得链表爱像一个环一样。如果一个链表中没有循环,那么这个链表就是一个单向链表。

以下是一个带有循环的单向链表的代码示例:

#include <iostream>

using namespace std;

struct ListNode {
    int val;          // 节点的值
    ListNode *next;   // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}
};

int main() {
    // 创建一个长度为6的循环链表,循环节的长度为4
    ListNode *head = new ListNode(1);
    ListNode *p = head;
    for (int i = 2; i <= 6; i++) {
        p->next = new ListNode(i);
        p = p->next;
    }
    p->next = head->next->next;

    // 找到链表的循环,并计算循环的长度
    ListNode *slow = head, *fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            int len = 0;
            do {
                len++;
                slow = slow->next;
            } while (slow != fast);
            cout << "链表的循环长度为:" << len << endl;
            break;
        }
    }
    return 0;
}

输出结果为:链表的循环长度为:4

什么是Floyd循环算法?

Floyd循环算法也称作龟兔赛跑算法,是一种用来查找链表中循环的算法。它利用两个指针,一快一慢,来遍历链表,如果链表中存在循环,那么这两个指针就一定会相遇。

Floyd循环算法需要使用两个指针,一个指针每次向前移动一个节点,另一个指针每次向前移动两个节点。如果链表中存在一个循环,那么这两个指针最终一定会相遇。

在相遇的时候,我们可以利用一个计数器来计算循环的长度。我们将其中一个指针,比如上面代码示例中的slow指针,从相遇点开始继续向前移动,每移动一步计数器加1,直到再次回到相遇点为止。这个计数器的值就是循环的长度。

以下是使用Floyd循环算法查找链表循环长度的代码示例:

// 找到链表的循环,并计算循环的长度
ListNode *slow = head, *fast = head;
while (fast != NULL && fast->next != NULL) {
    slow = slow->next;
    fast = fast->next->next;
    if (slow == fast) {
        int len = 0;
        do {
            len++;
            slow = slow->next;
        } while (slow != fast);
        cout << "链表的循环长度为:" << len << endl;
        break;
    }
}

怎么编写C++代码来计算链表的循环长度?

以下是使用Floyd循环算法查找链表循环长度的完整代码:

#include <iostream>

using namespace std;

struct ListNode {
    int val;          // 节点的值
    ListNode *next;   // 指向下一个节点的指针
    ListNode(int x) : val(x), next(NULL) {}
};

int getCycleLength(ListNode *head) {
    // 循环的长度设为0
    int len = 0;
    // 定义两个指针,一个每次移动一个节点,另一个每次移动两个节点
    ListNode *slow = head, *fast = head;
    while (fast != NULL && fast->next != NULL) {
        slow = slow->next;
        fast = fast->next->next;
        // 如果两个指针相遇了,说明链表中存在循环
        if (slow == fast) {
            // 将slow指针从相遇点开始移动,每移动一步计数器加1
            do {
                len++;
                slow = slow->next;
            } while (slow != fast);
            // 计算出循环的长度,返回结果
            return len;
        }
    }
    // 如果链表中没有循环,返回0
    return len;
}

int main() {
    // 创建一个长度为6的循环链表,循环节的长度为4
    ListNode *head = new ListNode(1);
    ListNode *p = head;
    for (int i = 2; i <= 6; i++) {
        p->next = new ListNode(i);
        p = p->next;
    }
    p->next = head->next->next;

    // 找到链表的循环,并计算循环的长度
    int len = getCycleLength(head);
    cout << "链表的循环长度为:" << len << endl;

    return 0;
}

输出结果为:链表的循环长度为:4

结论

Floyd循环算法可以用来查找链表中的循环,并且计算循环的长度。这个算法使用两个指针来遍历链表,一个每次移动一个节点,另一个每次移动两个节点。如果链表中存在循环,这两个指针最终一定会相遇。如果找到了相遇点,我们可以使用一个指针从相遇点开始继续遍历,每移动一步计数器加1,直到回到相遇点为止。这个计数器的值就是循环的长度。

C++中,我们可以编写一个函数来实现Floyd循环算法,计算链表的循环长度。使用这个函数可以让我们更方便地找到链表中的循环,并且得到循环的长度。

以上就是如何在链表中找到循环的长度的C++程序的相关内容,希望对大家有所帮助。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例