题目如下
本篇文章讨论的都是单链表
环形链表就是循环链表的意思。即链表的尾节点不是null,而是重新指向链表的其他节点。
判断一个单链表是否是循环链表,可以采用快慢指针,追击相遇的方式来实现。算法的原理可以形象的比喻成“龟兔赛跑”。兔子的速度是乌龟的两倍,它们在一个环形的跑道上面赛跑。经过一段时间之后,兔子必定会超过乌龟一圈,然后相遇。我们循环一个单链表,如果这个单链表是循环链表,快指针和慢指针必然会在某个节点相遇。
具体的数学证明,请参看这篇博文: https://blog.csdn.net/mucaoyx/article/details/81395782
以下是运行过程图以及实现代码。
/**
* Definition for singly-linked list.
* class Node {
* int val;
* Node next;
* Node(int x) {
* val = x;
* next = null;
* }
* }
*/
public boolean checkCircle(Node list){
if(list == null){
return false;
}
Node fast = list.next;
Node slow = list;
while (fast != null && fast.next != null){
fast = fast.next.next;
slow = slow.next;
if(slow == fast){
return true;
}
}
return false;
}