求链表中环的长度:如果链表中无环,则长度为0;所以需要先判断链表是否有环。此时要用到一个方法,见我另一篇博客,但是方法需要稍微变化一下:先求出快慢指针相遇的那个节点。
这个节点一定存在于环上:因为快指针比慢指针快,如果他两者相遇,必然在环上相遇,不存在在链上(除环以外的区域)相遇的可能。
从此节点开始,循环一圈回到此节点时,便求出了环的长度。代码如下:
//求环中相遇结点
public Node cycleNode(Node head){
//链表为空则返回null
if(head == null)
return null;
Node first = head;
Node second = head;
while(first != null && first.next != null){
first = first.next.next;
second = second.next;
//两指针相遇,则返回相遇的结点
if(first == second)
return first;
}
//链表无环,则返回null
return null;
}
public int getCycleLength(Node head){
Node node = cycleNode(head);
//node为空则代表链表无环
if(node == null)
return 0;
int length=1;
Node current = node.next;
//再次相遇则循环结束
while(current != node){
length++;
current = current.next;
}
return length;
}