解题思路:设置两个指针,同时从链表的头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的能够追上走的慢的,证明链表中又环
class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
public class Solution {
/**
* 判断链表中是否存在环,如果有,找出环的入口节点
*
* @param head
* @return
*/
public boolean findCircle(ListNode head) {
if (head == null) {
return false;
}
ListNode p1 = head;
ListNode p2 = head;
do {
if (p2.next != null) {
p2 = p2.next.next;
} else {
// 如果此时p2到达链表尾部,即不存在环
break;
}
p1 = p1.next;
} while (p2 != null && p1 != p2);
if (p2 == null) {
return false;
} else {
return true;
}
}
}