环形链表

LeetCode每日一题,141. Linked List Cycle

先看题目描述

大意就是给定一个链表,让我们判断链表中是否存在环

算法和思路

快慢指针

我们可以定义两个指针 slow 和 fast,slow 指针每次移动一步,fast 指针每次移动两步,我们经分析很容易得到,若链表中存在环,则 slow 指针和 fast 指针必然会相遇;若不存在环,则 fast 指针必先变为空指针

那么我们只需在移动 slow 和 fast 指针的过程中进行判断即可,若 slow 和 fast 指针相遇,说明链表中存在环,返回 true;若 fast 指针变为空指针,说明链表中不存在环,返回 false。若要求环的长度,则 环的长度就是 slow 指针和 fast 指针从第一次相遇到第二次相遇时,fast 指针比 slow 指针多走的步数

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* 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) {
if (head == null || head.next == null) {
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while (slow != fast) {
if (fast == null) {
return false;
}
slow = slow.next;
fast = fast.next;
if (fast == null) {
return false;
}
fast = fast.next;
}
return true;
}
}