判断链表是否有环问题
题目描述:给定一个链表,判断链表中是否有环
思路:
可以明确的是:若一个链表带环,那么用指针一直顺着链表遍历,最终会回到某个地方。
我们可以定义两个指针(快慢指针),两个指针均从表头开始同时遍历链表,快指针一次走两步,慢指针一次走一步。如果链表带环,那么快慢指针一定会相遇,否则快指针会先遍历完链表(遇到NULL)。
若是你不明白为什么链表带环,快慢指针就一定会相遇,那么你可以想想龟兔赛跑:
代码如下:
//给定一个链表,判断链表中是否有环
public boolean hasCycle() {
//相遇问题
if(this.head == null){
return false;
}
Node fast = this.head;
Node slow = this.head;
while( fast != null && fast.next!=null ){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
break;
}
}
if (fast == null || fast.next==null){
return false;
}
return true;
}
让快指针每次走两步,慢指针每次走一步,如果链表中有环,那么他们两个一定会相遇。