链表环:
判断是否存在环:
设置两个节点:slow、fast
若存在环,必定会在环上的节点相遇
public static boolean hasCircle(Node root){
Node slow=root;
Node fast=root;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
return true;
}
}
return false;
}
头结点和相遇结点时,将slow指向root,同步前进,则最后一定相遇在环入口结点。
fast、slow分别每次只走一步。
public static Node searchEntranceNode(Node root){
Node slow=root;
Node fast=root;
while(fast!=null&&fast.next!=null){
slow=slow.next;
fast=fast.next.next;
if(slow==fast){
break;
}
}
if(fast==null||fast.next==null){
return null;
}
slow=root;
while(slow!=fast){
slow=slow.next;
fast=fast.next;
}
return slow;
}
获取环的入口地址、循环一圈、每次加1
public int circleLength(Node root){
Node node=searchEntranceNode(root);
if(node==null){
return 0;
}
Node n=node.next;
int length=1;
while(n!=node){
length++;
n=n.next;
}
return length;
}