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

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

#include <iostream>

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`,表示这两个指针都有效,可以继续使用它们。

这是一种确保指针不为空的常见方式,以避免潜在的指针空指针异常。在使用指针之前,始终检查它是否为空是一种良好的编程习惯。*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值