力扣 141 环形链表: 哈希表判断 和快慢指针

给定一个链表,判断链表中是否有环。

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

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

哈希表思路:

遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。
1、unordered_set基于哈希表,是无序的。
2、unordered_set::count()函数是C++ STL中的内置函数,用于对unordered_set容器中特定元素的出现进行计数。由于unordered_set容器不允许存储重复的元素,因此该功能通常用于检查容器中是否存在元素。如果元素存在于容器中,则该函数返回1,否则返回0。
3、容器的插入:成员函数 insert() 可以插入作为参数传入的单个元素。在这种情况下,它会返回一个 pair 对象,这个 pair 对象包含一个迭代器,以及一个附加的布尔值用来说明插入是否成功。如果元素被插入,返回的迭代器会指向新元素;如果没有被插入,迭代器指向阻止插入的元素。。

实现步骤:

定义U_set
定义p指针
判断 查看set容器是否含有p节点 并且p节点不为空
内部 : 插入p节点
p指针继续遍历
如果hash表中有p节点 那么返回真
否则返回假

注意点:

1、判断hash是否含有之前标记的节点if 在循环外面
2、st.insert( p ):往hash表里插入
3、函数有返回值

class Solution {
public:
    bool hasCycle(ListNode *head) {
        unordered_set<ListNode*> st;
        ListNode* p = head;
        while(!st.count(p) && p != NULL)
        {
            st.insert(p);
            p = p->next;
        }
        if(st.count(p)) return true;
        return false;
    }
};

快慢指针:

设置两个指针,速度不同,当相遇时即为环链
没有找到pos标记为环链的方法 可能是后台设置 没懂
while循环以快指针为准 不然会出现空指针错误 循环中 f 速度快

class Solution {
public:
    bool hasCycle(ListNode *head) {
        ListNode *s=head;
        ListNode *f=head;
        while(f!=NULL&&f->next!=NULL)
        {
            f=f->next->next;
            s=s->next;
            if(s==f)
            {
                return true;
            }
        }
        return false;
    }
};

你可能感兴趣的:(LeetCode)