📜  用于检测链表中的循环的 C++ 程序(1)

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

用于检测链表中的循环的 C++ 程序

链表是一种常用的数据结构,但在链表实现中,可能会出现循环的情况。循环是指链表中的一部分节点形成了一个环形结构,使得遍历链表时会陷入死循环或者出现无法结束的错误。

为了避免链表循环带来的问题,我们需要编写一个能够检测链表循环的程序。以下是一个基于快慢指针算法的 C++ 程序实现。

#include <iostream>

using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

bool hasCycle(ListNode *head) {
    if (head == NULL) {
        return false;
    }
    ListNode *slow = head;
    ListNode *fast = head->next;
    while (fast != NULL && fast->next != NULL) {
        if (slow == fast) {
            return true;
        }
        slow = slow->next;
        fast = fast->next->next;
    }
    return false;
}

int main() {
    // 构造一个简单的链表测试程序
    ListNode *node1 = new ListNode(1);
    ListNode *node2 = new ListNode(2);
    ListNode *node3 = new ListNode(3);
    ListNode *node4 = new ListNode(4);
    ListNode *node5 = new ListNode(5);
    node1->next = node2;
    node2->next = node3;
    node3->next = node4;
    node4->next = node5;
    node5->next = node2;  // 构造循环
    // 测试循环检测函数
    bool has_cycle = hasCycle(node1);
    if (has_cycle) {
        cout << "链表中存在循环" << endl;
    } else {
        cout << "链表中不存在循环" << endl;
    }
    return 0;
}

使用快慢指针算法,将两个指针分别初始化为链表头节点和下一节点,快指针移动步长为2,慢指针移动步长为1,如果存在循环,则快慢指针会在某个时刻相遇。如果链表为空或者链表为单节点,则不存在循环。