博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构与算法 | Leetcode 141:Linked List Cycle
阅读量:7051 次
发布时间:2019-06-28

本文共 1433 字,大约阅读时间需要 4 分钟。

pexels-photo-589810

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

链表环检测

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

使用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判圈算法

如果有限状态机、迭代函数或者链表上存在环,那么在某个环上以不同速度前进的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).

参考资料

  • 《》

转载地址:http://agpol.baihongyu.com/

你可能感兴趣的文章
git基本的使用原理
查看>>
Ubuntu机器学习python实战(一)k-近邻算法
查看>>
Reachability(判断网络是否连接)
查看>>
sql奇特的语句
查看>>
安卓之文件结构
查看>>
java 线程
查看>>
嵌入式,代码调试----GDB扫盲
查看>>
IDEA 关于maven项目引入css ,js,image文件 路径的问题
查看>>
进度一
查看>>
composer 安装Laravel
查看>>
项目2.0上线,回想过后杂谈总结基础回顾一番
查看>>
冲刺一 (day 3)
查看>>
Beep使用
查看>>
关于php网络爬虫phpspider。
查看>>
OpenGL的glRotatef旋转变换函数详解
查看>>
c#中 ==与equals有什么区别
查看>>
Oracle Group By ROLLUP-SubTotal
查看>>
PHP 正则表达式
查看>>
Computer Graphics Research Software
查看>>
nodejs进阶(2)—函数模块调用
查看>>