这是悦乐书的第176次更新,第178篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第35题(顺位题号是141)。给定一个链表,确定它是否有一个循环。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 理解题意

什么样结构的链表才算是拥有一个循环呢?

链表中某一节点的引用指向了当前链表中已经存在的另一节点时,此链表存在循环。

ListNode L = new ListNode(1);
ListNode L2 = new ListNode(2);
ListNode L3 = new ListNode(3);
ListNode L4 = new ListNode(4);
ListNode L5 = new ListNode(5);
ListNode L6 = new ListNode(6);
L.next = L2;
L2.next = L3;
L3.next = L4;
L4.next = L5;
L5.next = L3;

上面的链表就存在循环,L5的引用指向了L3。如果仅仅是节点值相等,是不存在循环的,因为他们的引用始终不同。

03 第一种解法

可以打个比方,如果两个人甲和乙同时在一条跑道上跑步,甲以2.5m/s的速度向前跑,乙以5m/s的速度向前跑,如果跑道是环形的,甲和乙肯定会在某一个地方至少相遇一次;如果跑道是直线形或非环形的,甲和乙是不会相遇的。

使用双指针,一个是正常向前,一次移动一个节点,第二个是间隔一个节点向前移动,如果第二个指针碰到了可以循环的节点,会在循环的过程中遇到第一个指针,此时就满足了形成循环的条件。

特殊情况:链表为空时,直接返回false。

public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode slow = head;
ListNode fast = head;
while (slow != null && fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}

04 第二种解法

还是以上面跑步为例,不过稍微有点变化。甲还是以2.5m/s的速度跑步,此时乙在跑道中给了甲一根棒子,并站在原地等甲把棒子还给自己,如果跑道是环形的,乙肯定是会等到甲把棒子还给自己,如果跑道是直线或者非环形的,甲就带着棒子自己跑了。

我们可以使用一个标记,赋值给每一个节点,然后使用递归,直到碰到给出去的标志为止。

public boolean hasCycle2(ListNode head) {
if(head == null) {
return false;
}
if (head.val == Integer.MIN_VALUE-1) {
return true;
}
head.val = Integer.MIN_VALUE-1;
return hasCycle2(head.next);
}

如果某一个节点正好本身就拥有所要赋值的标志呢?会有一定影响,如果限制节点值的取值范围,此解法是完全可行的。

05 第三种解法

使用哈希表,将每一个节点的引用都存起来,如果哈希表中存在了某一个节点的引用,说明此链表是循环的。

public boolean hasCycle3(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)。

06 小结

笔试或者面试遇到此题时,推荐第一种解法,如果有限制链表节点值的取值范围,第二种解法也是完全可行的。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Linked List Cycle(Java实现)的更多相关文章

  1. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  2. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  3. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  4. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

  5. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  6. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  7. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

  8. LeetCode算法题-Design HashSet(Java实现)

    这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...

  9. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

随机推荐

  1. Perl处理数据(一):s替换、split和join

    s替换 m//模式用来匹配文本,也就是说用来找数据.而s///用来查找并替换文本,所以可以用来处理文本文件.在有了正则的基础之后,s///用起来会简单很多. 用法格式为: $str =~ s/reg/ ...

  2. centos7修改网卡名称为eth0-技术流ken

    前言 在配置集群的时候,需要保持网卡名称一致,所以我们需要修改centos7中的网卡名称为eth0. 检查网卡 检查网卡,现在网卡名称是ens33 [root@localhost ~]# ip a : ...

  3. spring_01概念及案例

    1.什么是IOC? IOC概念:inverse of Controll,控制反转,所谓控制反转,就是把创建对象和维护对象关系的权利从程序中转移到spring的容器中(applicationContex ...

  4. 【Java每日一题】20170307

    20170306问题解析请点击今日问题下方的“[Java每日一题]20170307”查看(问题解析在公众号首发,公众号ID:weknow619) package Mar2017; public cla ...

  5. Java学习笔记之——final关键字

    最终的,最后的 可以修饰:变量.方法.类 (1) 修饰变量 不可改变,即常量,只能赋值一次,赋值之后不可改变 a. 修饰属性:private final int num; 要求属性要显式赋值 通常在属 ...

  6. 快速排序 and 拉格朗日插值查找

    private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...

  7. 剑指offer:2.二维数组的查找(Java版)

    备注:本文参照<剑指offer第二版> 题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数, 输入这样的一个二维数组和一个整数 ...

  8. MVC模式-----struts2框架

    MVC模式-----struts2框架 一.struts MVC模式 1.概述 MVC是模型(model)---视图model(view)---控制器(control)的缩写,是一种用于将逻辑.数据和 ...

  9. Django的URL路由系统

    一. URL配置 URL配置就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图之间的映射表.你就是以这种方式告诉Django,对于哪个URL调用的这段代码. 基本格式 from ...

  10. 2018-08-29 浏览器插件实现GitHub代码翻译原型演示

    此原型源自此想法: 中文化源码. 考虑到IDE插件工作量较大, 且与IDE绑定. 在代码转换工具的各种实现中, 综合考虑实用+易用+长远改进潜力, 浏览器插件似乎较有优势. 于是用最快捷的方式实现这一 ...