这是 LintCode 上面的一个算法题目--带环链表,目的是判断链表是否有环。
问题描述:
给定一个链表,判断它是否有环。
样例说明:
给出 -21->10->4->5, tail connects to node index 1,返回 true
代码
public class TestHasCycle {
public boolean hasCycle(ListNode head) {
// 带环链表是不存在null节点的,因此无论什么时候, 碰到null节点,说明不存在环
if (head == null || head.next == null) return false;
// 我们假设有两个步长不一样的点在链表上面移动,一个步长为1,
// 一个步长为2,初始化假设步长为2的点在前面,步长为1的点在后面。
// 这样方便使用hasCycle(ListNode node1, ListNode node2)方法,避免提前碰撞
return hasCycle(head, head.next);
}
private boolean hasCycle(ListNode node1, ListNode node2) {
if (node1 == null || node2 == null) return false;
// 当两个步长不一样的点发生了碰撞,只能是步长为2的点追到了步长为1的点
// 这说明步长为2的点已经绕回来了,所以有环
if (node1 == node2) return true;
if (node2.next == null) return false;
return hasCycle(node1.next, node2.next.next);
}
}
附上链节点的定义:
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}