/**
* 判断链表是否有环
* @author MA
*
*/
public class Main {
static class node{
int var;
node next;
public node(int var){
this.var = var;
}
}
public static boolean isLoop(node head){
if(head == null || head.next == null){
return false;
}
node one = head;
node twe = head.next;
while(twe != null && twe.next != null){
one = one.next;
twe = twe.next.next;
if(twe == null){
return false;
}
if(one.var == twe.var){
return true;
}
}
return false;
}
/**
* 求环的长度
* 前提:两节点已经相交,已判定有环
* ndoe1:相交节点
*/
public static int getLength(node node1){
node p1 = node1;
node p2 = node1.next;
int length = 0;
while(p1.var != p2.var){
length++;
p1 = p1.next;
p2 = p2.next.next;
}
return length;
}
/**
* 求切入点
* head:链表头节点
* node1:p1、p2的相交点
*/
//思路:链表的头节点到入口的长度等于相交点到入口的距离
/*
* 定义a如下: 链表头移动a步到达入口点。
定义x如下: 入口点移动x步到达相遇点。
定义r如下: 环的长度。
定义L如下: 链表总长度为L。
p1=a+x
p2 = 2p1
2p1 = p1 + n*r
a+x = n*r
a+x = (n-1)*r + r
L=a+r
r = L-a
a+x = (n-1)*r + L - a
a = (n-1)*r + L -a -x
*/
public static node getqieru(node head,node node1){
node rhead = head.next;
node rnode = node1.next;
node rukou = null;
while(rhead != rnode){
rhead = rhead.next;
rnode = rnode.next;
}
rukou = rhead;
return rukou;
}
}