【Leetcode刷题】141、环形链表

原题链接:https://leetcode.cn/problems/linked-list-cycle/?favorite=2cktkvj

给你一个链表的头节点 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

解释:链表中没有环。

解法一:无序哈希表

利用无序哈希表存入每次不同的节点,并判断此节点没有重复计数过,那么就没有环;反之,则有。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        unordered_set<ListNode*> p;    //声明一个无序哈希表
        while(head != nullptr){    //如果节点不为空
            if(p.count(head)){    //在哈希表内有相同的节点
                return true;    //返回 true
            }
            p.insert(head);    //向p中加入节点
            head = head->next;    //将节点移向下一位

        }
        return false;
    }
};

解法二:快慢指针

利用无序哈希表存入每次不同的节点,并判断此节点没有重复计数过,那么就没有环;反之,则有。
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == nullptr || head->next == nullptr ) return false;    //判断快慢节点与节点下一个是否为空   
        ListNode * fast = head -> next;    //定义一个快指针
        ListNode* slow = head;    //定义一个慢指针
        while(slow!=fast){    //慢指针不等于快指针则继续循环
            if(fast == nullptr || fast -> next == nullptr){    //如果快指针为空或下一位为空,则判定没有环
                return false;
            }
            fast = fast->next->next;    //快指针前进两位
            slow = slow->next;        //慢指针前进一位
        }    
        return true;    //如果退出循环则
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_60154963/article/details/128763719
今日推荐