BAT算法面试题(12)--环形链表(哈希表法)

BAT面试算法进阶(11)- 最长的斐波那契子序列的长度(动态规划法)
BAT面试算法进阶(10)- 最长的斐波那契子序列的长度(暴力法)
BAT面试算法进阶(8)- 删除排序数组中的重复项
BAT面试算法进阶(7)- 反转整数
BAT面试算法进阶(6)- BAT面试算法进阶(6)-最长回文子串(方法二)
BAT面试算法进阶(5)- BAT面试算法进阶(5)- 最长回文子串(方法一)
BAT面试算法进阶(4)- 无重复字符的最长子串(滑动法优化+ASCII码法)
BAT面试算法进阶(3)- 无重复字符的最长子串(滑动窗口法)
BAT面试算法进阶(2)- 无重复字符的最长子串(暴力法)
BAT面试算法进阶(1)--两数之和

一.面试题目

给定一个链表,判断链表中是否有环.
难度升级: 试试能否在不使用额外空间解决此问题?

二.解决方案(哈希表)

思路

我们可以通过检查一个结点此前是否被访问过来判断链表是否为环形链表.常用方法,一般是使用哈希表.

算法

我们遍历所有的节点并在哈希表中存储每个结点的引用(或内存地址).如果当前节点为空结点null,表示我们已经检测到链表的末尾的下一个节点.那么表示我们已经完成了链表的遍历,并且此链表不是环形链表.如果当前结点的引用已经存在过哈希表中,那么即可立马返回true(表示此链表为环形链表).

三.代码

Java Code

public boolean hasCycle(ListNode head) {
    Set<ListNode> nodesSeen = new HashSet<>();
    while (head != null) {
        if (nodesSeen.contains(head)) {
            return true;
        } else {
            nodesSeen.add(head);
        }
        head = head.next;
    }
    return false;
}

四.复杂度分析

  • 时间复杂度: O(n),对于含有n个元素的链表,我们访问每个元素最多一次.添加一个结点到哈希表中只需要花费O(1)的时间.
  • 空间复杂度:O(n),空间取决于添加哈希表中的元素数目.最多可以添加n个元素.

五.学习建议

  • 只要明白哈希表,即可解决这个问题.!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,994评论 0 13
  • 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识...
    醒着的码者阅读 4,618评论 1 45
  • 原文地址:http://theory.stanford.edu/~amitp/GameProgramming/ 1...
    达微阅读 19,651评论 0 28
  • 1、人们希望按照自己的意愿去控制他人,而且如果对方不能满足自己,也就是如果不能掌控对方的话,就有烦躁不安和愤怒的情...
    唛咔伽琪阅读 252评论 0 0
  • 三国期间雍凉两地饱受异族侵袭,羌胡之人在这里作威作福,但也给这片土地带来了彪悍的民风,带来了虎步雍凉的名将,也催生...
    秉笔春秋吕书生阅读 410评论 2 9