C++之快慢针检测链表是否有环

下面可直接运行的C++。

#include 

struct ListNode {
    int value;
    ListNode* next;
    ListNode(int val) : value(val), next(nullptr) {}
};

bool hasCycle(ListNode* head) {
    if (!head || !head->next) {
        // 如果链表为空或只有一个节点,肯定没有环
        return false;
    }

    ListNode* slow = head;  // 慢指针
    ListNode* fast = head;  // 快指针

    while (fast && fast->next) {
        slow = slow->next;    // 慢指针前进一步
        fast = fast->next->next;  // 快指针前进两步

        // 如果快指针追上了慢指针,说明有环
        if (slow == fast) {
            return true;
        }
    }

    // 如果没有环,快指针会到达链表的末尾
    return false;
}

int main() {
    // 创建一个有环的链表
    ListNode* head = new ListNode(1);
    ListNode* second = new ListNode(2);
    ListNode* third = new ListNode(3);
    ListNode* fourth = new ListNode(4);

    head->next = second;
    second->next = third;
    third->next = fourth;
    fourth->next = second;  // 形成环

    if (hasCycle(head)) {
        std::cout << "链表中存在环." << std::endl;
    } else {
        std::cout << "链表中不存在环." << std::endl;
    }

    return 0;
}
/*`fast && fast->next` 是一个条件表达式,用于检查指针 `fast` 和 `fast->next` 是否都存在且有效。让我解释一下:

- `fast` 是一个指针,它表示快指针。
- `fast->next` 表示快指针指向的下一个节点的指针。

这个条件表达式的目的是确保在访问 `fast` 和 `fast->next` 之前,它们都存在且不为 `nullptr`。这是因为在 C++ 中,尝试访问一个空指针可能导致未定义行为,甚至引发程序崩溃。

所以,`fast && fast->next` 表达式执行以下操作:

1. 首先检查 `fast` 是否为 `nullptr`(即指针是否为空)。如果 `fast` 为空,整个表达式的值为 `false`,且不会再继续计算后面的条件。

2. 如果 `fast` 不为空,继续检查 `fast->next` 是否为空。如果 `fast->next` 为空,整个表达式的值为 `false`。

3. 如果 `fast` 和 `fast->next` 都不为空,整个表达式的值为 `true`,表示这两个指针都有效,可以继续使用它们。

这是一种确保指针不为空的常见方式,以避免潜在的指针空指针异常。在使用指针之前,始终检查它是否为空是一种良好的编程习惯。*/

你可能感兴趣的:(c++,链表,开发语言)