数据结构与算法 | Leetcode 141:Linked List Cycle

pexels-photo-589810

原文链接:https://wangwei.one/posts/java-algoDS-linked-list-cycle.html

前面,我们实现了链表的 反转 操作,本篇来聊聊,如何检测单链表中的环。

链表环检测

Leetcode 141: Linked List Cycle

有两种方法来解决这个问题:

使用Hashing

思路

定义一个Map,当循环遍历Linked List时,依次将Node放入Map中,等到循环到下一轮时,检查Node是否存在于Map中,若存在则表示有环存在。

实现

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    
    public boolean hasCycle(ListNode head) {
        Map map = new IdentityHashMap();
        for(ListNode x = head; x != null;){
            if(map.containsKey(x)){
                return true;
            }
            map.put(x, null);
            x = x.next;
        }
        return false;
    }
}

Floyd判圈算法

这一种方法,不上网查资料是怎么也想不到的,非常巧妙!!!

Floyd判圈算法

如果有限状态机、迭代函数或者链表上存在环,那么在某个环上以不同速度前进的2个指针必定会在某个时刻相遇。同时显然地,如果从同一个起点(即使这个起点不在某个环上)同时开始以不同速度前进的2个指针最终相遇,那么可以判定存在一个环,且可以求出2者相遇处所在的环的起点与长度。

从Linked List的Head节点出发,我们定义两个移动指针,一个的移动速度为每次前进一个节点,另一个每次前进两个节点。然后判断这两个指针移动后的结果是否相等。

代码

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    
    public boolean hasCycle(ListNode head) {
        ListNode slow = head;
        ListNode fast = head;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){
                return true;
            }
        }
        return false;
    }
}

这两种方式的时间复杂度均为O(n),空间复杂度均为O(1).

参考资料

推荐阅读更多精彩内容

  • 链表删除[203] Remove Linked List Elements[19] Remove Nth Node...
    野狗子嗷嗷嗷阅读 6,004评论 4 35
  • 栈 1. 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被...
    程序员高级码农阅读 5,874评论 0 11
  • 链表同数组是一种线性的数据结构,与数组不同,其内存空间非连续,可以合理地利用内存碎片。 由于链表中的每一项都有指针...
    s1991721阅读 321评论 0 1
  • 花2天把Leetcode上Linked lists的题目刷完了,下面是一些我觉得比较有倾诉欲望的题。 237. D...
    __小赤佬__阅读 443评论 0 1
  • 开启这本书主要是被大标题给吸引了《高情商不尬聊》,原以为是职场沟通教材书,没想到翻开以后是一本撩妹秘籍,全书以理论...
    爱上神难懂阅读 605评论 0 0
  • 一到六七月份就是升学入学季,妈妈群里都是在讨论自己宝贝被分到哪个幼儿园和哪个小学的话题,伊一虽然离入学还早,但未雨...
    伊一妈咪阅读 211评论 0 0
  • 主持人:我刚才之所以问中国教育的根本出路,是因为从三十年前就有这样一个观点,中国教育是最难攻克的堡垒。相比起其他国...
    弘谦学堂阅读 30评论 0 0
  • 图文/唐茶 下雨的清晨 全速步行 一靴的水 一头的汗 这秋雨一阵紧似一阵给山川换装 蝉、蜻蜓还有蛙们都去哪了 哎呀...
    唐小桔阅读 673评论 21 19
  • 郭相麟 秋夜 空气中弥漫着 雨后湿润的味道 走在林中的小路上 闻着那湿润淡淡的味道 皮鞋声音在水泥路上 发出清脆的...
    郭相麟阅读 77评论 0 0