判断给定的链表中是否有环。如果有环则返回true,否则返回false。
思路:
对于这个问题我们可以采用“快慢指针”的方法。就是有两个指针fast和slow,开始的时候两个指针都指向链表头head,然后在每一步
操作中slow向前走一步即:slow = slow->next,而fast每一步向前两步即:fast = fast->next->next。
由于fast要比slow移动的快,如果有环,fast一定会先进入环,而slow后进入环。当两个指针都进入环之后,经过一定步的操作之后
二者一定能够在环上相遇,并且此时slow还没有绕环一圈,也就是说一定是在slow走完第一圈之前相遇。
package datastructure;
public class TestIsCircleList {
public static void main(String[] args) {
TestIsCircleList t = new TestIsCircleList();
ListNode a = new ListNode(1);
ListNode b = new ListNode(2);
ListNode c = new ListNode(3);
ListNode d = new ListNode(4);
ListNode e = new ListNode(5);
ListNode f = new ListNode(6);
ListNode g = new ListNode(7);
a.next = b;
b.next = c;
c.next = d;
d.next = e;
e.next = f;
f.next = g;
//g.next = d;
boolean isHave = t.hasCycle(a);
System.out.println(isHave);
}
public boolean hasCycle(ListNode head) {
// 可以省略
// if(null == head || head.next == null){
// return false;
// }
ListNode slow = head; // 慢指针
ListNode fast = head; // 快指针
while(fast!=null && fast.next != null){
slow = slow.next; // 慢指针,每次走一部
fast = fast.next.next; // 快指针,每次走两部
if(slow == fast){
return true;
}
}
return false;
}
}