快慢指针,在这里面有两个指针,一个是依次遍历跑两个数据,一个是依次遍历一个数据。最终肯定会有一个点相遇,可能不会在第一圈,可能会在第二圈。
public boolean hasCycle(ListNode head) {
if(head==null||head.next==null)return false;
ListNode slow=head;
ListNode fast =head.next;//这里面就没有把特别的第一个慢的和快的放到了一起,因为第一次就相遇了,还得在讨论情况,这样也就避免了这样的写做。
while(fast!=null&&fast.next!=null) {
slow=slow.next;
fast=fast.next.next;
if(slow==fast)return true;
}
return false;
}
在这里面为什么还要fast!=null&&fast.next!=null我们是要判断是否有环形链表的,有环型链表则他就是无限循环条件知道两个节点碰到的时候结束进程,当没有的时候也就不会有所返回,直接进行下面的return false;,里面的return true;也是结束整个hasCycle方法进程的。