有环链表

题意

给定一个链表,判断它是否有环。

样例

A:   1->5->10->11->18
           ↑       ↓
           ↑       ↓
           ↑ ← ← ← ←

A:   1->5->10->11->18->null

链表 A 的第五个节点 18 的 next 节点是 10,如此构成有环链表。

链表 B 则是一个无环链表。

思路

如果链表有环,可以把有环部分看成一个跑道,有两个人,一个跑的快,一个跑的慢,如此一直跑下去,跑的快的一定会追上跑的慢的。

如果链表无环,那么跑的快的那个一定会先到达链表尾部,也就是 NULL。

我们可以设置两个指针来模拟那两个跑的快的人和跑的慢的人,一个指针每次向后移动一位,另一个指针每次向后移动两位,直到两者相遇或快指针到达链表尾部。

代码实现

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
33
/**
* Definition for ListNode.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int val) {
* this.val = val;
* this.next = null;
* }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @return: True if it has a cycle, or false
*/
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}

ListNode slow = head, fast = head;

while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
}

原题地址

LintCode:带环链表

坚持原创技术分享,您的支持将鼓励我继续创作!