题目:
给定一个链表,判断链表中是否有环。
分析:
快慢指针法:
我们知道,假设一个链表有环,那么它就永远走不到头。
设定有两个指针,一个快指针,一个慢指针。其中,快指针一次遍历两个节点;慢指针遍历一个节点,它们都是从头开始往后遍历所有的节点。
如果链表中没有环,那么快指针与慢指针都会先后遍历完所有的节点。
如果链表中有环,则快慢指针会进入环中直到某次的遍历时相遇。一旦相遇,就证明该链表中存在环。
package swordOffer;
import swordOffer.EntryNodeOfLoop.ListNode;
public class hasCycle {
public static class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
public static boolean hasCycle(ListNode node) {
if(node == null) {
return false;
}
ListNode quick = node;
ListNode slow = node;
while(quick != null) {
slow = slow.next;//first指针走一步
quick = quick.next.next; //second指针走两步
if(quick == slow) { //一旦两个指针相遇,说明链表是有环的
return true;
}
}
return false;
}
}