• 141.环形链表-LeetCode


    141.环形链表


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

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

    你能用 O(1)(即,常量)内存解决此问题吗?
    拓展题目:
    面试题 02.08. 环路检测

    思路

    思路一 哈希表法


    遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。

    具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。

    class Solution {
    public:
        bool hasCycle(ListNode *head) {
            unordered_set<ListNode*> seen; //C++11
            while (head != nullptr) {
                if (seen.count(head)) {    //在unordered_set插入head后  和 head = head->next
                    return true;           //再对元素进行计数 如果该元素已经在集合中 说明有环
                }
                seen.insert(head);
                head = head->next;
            }
            return false;
        }
    };
    

    拓展 unordered_set

    类模板
    std :: unordered_set

    template < class Key,                        // unordered_set::key_type/value_type
               class Hash = hash<Key>,           // unordered_set::hasher
               class Pred = equal_to<Key>,       // unordered_set::key_equal
               class Alloc = allocator<Key>      // unordered_set::allocator_type
               > class unordered_set;
    

    无序集
    无序集合是不按特定顺序存储唯一元素的容器,并允许根据其值快速检索单个元素。

    在unordered_set中,元素的值同时是它的key,可以唯一地标识它。键是不可变的,因此,无法在容器中一次修改unordered_set中的元素-尽管可以将其插入和删除。

    在内部,unordered_set中的元素未按任何特定顺序排序,而是根据其哈希值组织到存储桶中,以允许直接通过其值快速访问各个元素(平均平均时间复杂度恒定)。尽管

    unordered_set容器通过其键访问单个元素的速度要比set容器快,但是通常通过它们的元素子集进行范围迭代的效率较低。 容器中的迭代器至少是前向迭代器。

    思路二 快慢指针法(龟兔赛跑法)


    设置两个指针,快指针一次走两步 慢指针一次走一步
    如果有环,那么快慢指针一定会相遇,如果不相遇,那么不存在环
    代码:

    /**
     * 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 == NULL|| head->next == NULL )
                return false;
            ListNode * slow = head;
            ListNode * fast = head->next;
            while(fast!=slow)
            {
                if(fast==NULL || fast->next ==NULL) return false;
                slow = slow->next;
                fast = fast->next->next;
            }
            return true;
        }
    };
    

    链接

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/linked-list-cycle
    链接:https://leetcode-cn.com/problems/linked-list-cycle/solution/huan-xing-lian-biao-by-leetcode-solution/

  • 相关阅读:
    Android TabActivity中onKeyDown无效问题
    原生App切图的那些事儿
    android评分条RatingBar自定义设置
    android 软键盘自动弹出和关闭
    android 编程之 PopupWindow 窗口的弹出
    使用Android拨打电话功能
    实景三维系列1 | 倾斜摄影发展历程
    规划设计系列4 | 盘活电脑里的规划方案,想看就看
    规划设计系列3 | SketchUp+实景三维,方案现状一起看
    规划设计系列2 | 项目沟通非小事,实景三维帮大忙
  • 原文地址:https://www.cnblogs.com/jiashun/p/LeetCode_141.html
Copyright © 2020-2023  润新知