题目:
给定一个链表,判断链表中是否有环。
为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。如果pos是-1,则在该链表中没有环。
示例1:
输入:head = [3,2,0,-4], pos = 1
输出:true
动图来源五分钟学算法公众号
解释:链表中有一个环,其尾部连接到第二个节点。
解题思路: 利用快慢指针来解决。
/**
* 描述: 1 判断链表是否有环
* 2 判断环的长度
* 3 判断入环点的位置
*
* @author pengjie_yao
* @date 2019/7/13 9:46
*/
public class CircularLinked {
/**
* 判断链表是否有环: 采用快慢指针方式
* @param head
*/
public static Boolean isCycle(Node head){
// 1 设置快慢指针
Node slower = head;
Node quick = head;
// 2 遍历链表判断
while (quick != null && quick.next != null) {
// 3 快指针每次走两步,慢指针每次走一步,两者如果相遇则跳出循环
slower = slower.next;
quick = quick.next.next;
if (slower.data == quick.data) {
return true;
}
}
return false;
}
public static void main(String[] args) {
Node node = new Node(5);
Node node1 = new Node(3);
Node node2 = new Node(7);
Node node3 = new Node(2);
Node node4 = new Node(6);
Node node5 = new Node(8);
Node node6 = new Node(1);
node.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node3;
Boolean result = isCycle(node);
System.out.println("该链表是否是循环链表的结果为:" + result);
}
/**
* 节点
*/
private static class Node {
int data;
Node next;
Node(int data) {
this.data = data;
}
}
}