LeetCode Java刷题笔记—141. 环形链表
Posted 刘Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode Java刷题笔记—141. 环形链表相关的知识,希望对你有一定的参考价值。
给你一个链表的头节点 head ,判断链表中是否有环。这道题可以说是快慢指针方式的入门题目,只要明白了快慢指针,这道题就很好解。
所谓快慢指针,可以类比两个人从同一个起点沿着同一路线一直向前跑,其中一个跑得快,另一个跑得慢。,如果这条路线有环,并且一直跑下去,那么跑得快的人一定可以和跑得慢的在某一个点相遇,另一个常见的例子就是在操场跑步的时候,如果不设终点一直跑下去,那么跑得快的人肯定可以反向追上跑得慢的人。
这道题也是上面的思想,采用一快一慢连个指针,都从起点出发向后移动,如果某个时刻两个指正指向同一个节点,那么就证明链表上有环,如果某个时刻快指针到达了终点,这就证明这个链表无环。
慢指针一次移动一步,快指针每次移动两步,为什么是两步而不是更多的步数呢?可以想象,如果一次移动两步以上,那么快指针就完全有可能直接跨过慢指针,而不会指向同一个节点。
/**
* 141. 环形链表
* 给你一个链表的头节点 head ,判断链表中是否有环。
* https://leetcode-cn.com/problems/linked-list-cycle/
* 简单
*/
public class LeetCode141
/**
* 快慢双指针
*/
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 (fast == slow)
return true;
return false;
/**
* hash表取巧
*/
public boolean hasCycle2(ListNode head)
Set<ListNode> seen = new HashSet<>();
while (head != null)
if (!seen.add(head))
return true;
head = head.next;
return false;
public class ListNode
int val;
ListNode next;
ListNode()
ListNode(int val)
this.val = val;
ListNode(int val, ListNode next)
this.val = val;
this.next = next;
以上是关于LeetCode Java刷题笔记—141. 环形链表的主要内容,如果未能解决你的问题,请参考以下文章