LeetCode链表 141. 环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

快慢指针方法(带有指针的基本定义方法)

#include <iostream>



// 定义单链表的节点结构

struct ListNode {

    int val;

    ListNode *next;

    //val是结构体中一个变量成员   next(nullptr)代表自动定义了下一个指针指向空

    explicit ListNode(int x) : val(x), next(nullptr) {}

//    explicit 防止隐形调用

//    使用后正确的传值方法为MyClass obj(10);

//    而不被 MyClass obj = 10; 影响

};





class Solution {

public:

    // 检测链表中是否有环

    bool hasCycle(ListNode *head) {

        ListNode *slow = head; // 慢指针,每次移动一步

        ListNode *fast = head; // 快指针,每次移动两步

        while (fast != nullptr) {

            slow = slow->next;  // 慢指针向前移动一步

            if (fast != nullptr) {

                fast = fast->next;  // 快指针向前移动两步

                if (fast != nullptr) {

                    fast = fast->next;  // 快指针再次向前移动两步

                }

            }

            // 如果快指针和慢指针相遇,说明存在环

            if (fast == slow) {

                return true;

            }

        }

        // 快指针到达链表末尾,说明没有环

        return false;

    }

};



// 主函数,用于测试hasCycle函数

int main() {

    // 创建一个示例链表: 1 -> 2 -> 3 -> 4 -> 2 (2是环的起点)

    ListNode *head = new ListNode(1);

    head->next = new ListNode(2);

    head->next->next = new ListNode(3);

    head->next->next->next = new ListNode(4);

    head->next->next->next->next = head->next; // 形成环

    

    Solution solution;

    // 测试hasCycle函数

    if (solution.hasCycle(head)) {

        std::cout << "The linked list has a cycle." << std::endl;

    } else {

        std::cout << "The linked list has no cycle." << std::endl;

    }

    

    // 清理链表内存

//    ListNode *current = head;

//    while (current != nullptr) {

//        ListNode *temp = current;

//        current = current->next;

//        delete temp;

//    }

    

    return 0;

}

哈希做法

class Solution {
public:
    bool hasCycle(ListNode *head) {
        unordered_set<ListNode*> seen;
        while (head != nullptr) {
            if (seen.count(head)) {  //如果这个点已经被访问过一次了 说明形成闭环
                return true;
            }
            seen.insert(head);    //添加这个数值 代表查询过了
            head = head->next;   //指向下一个点,更新位置
        }
        return false;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值