Q:判断链表是否有环,有返回TRUE 无返回FALSE
A:使用快慢指针。根据链表的性质:一个节点后面只能有一个指针,不能有两个指针,因此可知链表若有环的话必定在末尾,不可能在中间。线形链表遍历到NULL的时候可以结束,那环形链表遍历就不会结束了!可以使用快慢指针,一个指针走两步,一个指针走一步,只要有环,二者定会在环中不断循环,且速度不同,则一定会相遇
1.设置两个指针,都指向head;
2.快指针每次走两步,慢指针每次走一步
3.如果快指针到了链表尾部,说明没有环
4.快慢指针相遇,说明有环
/**
* 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) {
return false;
}
ListNode fast = head;
ListNode slow = head;
while(fast!=null && fast.next!=null) {
//快指针走两步
fast = fast.next.next;
//慢指针走一步
slow = slow.next;
if(fast==slow) {
return true;
}
}
return false;
}
}