java中while循环到递归的转换

java中while循环到递归的转换,java,recursion,data-structures,Java,Recursion,Data Structures,嗨,我正在尝试将这个java while循环代码转换为递归。我曾尝试将其转换为递归,但不断出现错误。当我将while循环转换为递归时,当我遇到错误时,while循环工作正常。任何关于如何将其转换为递归的帮助都将不胜感激,谢谢 public static boolean hasCycle( Node head) { Node slow = head; Node fast = head; boolean loop = false; while (slow != n

嗨,我正在尝试将这个java while循环代码转换为递归。我曾尝试将其转换为递归,但不断出现错误。当我将while循环转换为递归时,当我遇到错误时,while循环工作正常。任何关于如何将其转换为递归的帮助都将不胜感激,谢谢

public static boolean hasCycle( Node head) {
    Node slow = head;
    Node fast = head; 
    boolean loop = false; 
    while (slow != null && fast != null && fast.getNext() != null) {
        slow = slow.getNext();
        fast = fast.getNext().getNext();

        if(slow == fast) {
            loop = true;
            break;
        }
    }
    return loop;

}
//递归码

    Node slow = head;
    Node fast = head; 
    boolean loop = false; 

    if(slow == fast) {
        return true;
    }else if(slow != fast) {
        if(slow.getNext() != null) {
            return hasCycle(slow.getNext());
        }
        return false;
    }else {
        if(fast.getNext() != null) {
            return hasCycle(fast.getNext());
        }
        return false;
    }

您似乎只在第一个迭代版本中检查即时循环。(您没有检查是否有更大的循环a->B->C->a。您只检查循环a->B->a)。我认为你所呈现的是正确的,你想要的,尽管有些奇怪。(如果你有一个更大的循环,它将无限继续)

执行递归演示的正确且更简单的方法是:

public boolean hasImmediateCycle(Node node) {
   if (node == null || node.getNext() == null) {
      return false;
   } else if (node == node.getNext().getNext()) {
      return true;
   } else {
      return hasImmediateCycle(node.getNext());
   }
}
如果您想让它检查所有可能的循环,您需要稍微不同:

private boolean hasCycle(Node node, Set<Node> seen) {
   if (node == null) {
      return false;
   } else if (seen.contains(node)) {
      return true;
   } else {
      seen.add(node);   
      return hasCycle(node.getNext(), seen);
   }
}

public boolean hasCycle(Node node) {
  return hasCycle(node, new HashSet<Node>());
}
private boolean hasCycle(节点节点,已查看集){
if(node==null){
返回false;
}else if(seen.contains(节点)){
返回true;
}否则{
seen.add(节点);
返回hasCycle(node.getNext(),请参见);
}
}
公共布尔hasCycle(节点){
返回hasCycle(node,newhashset());
}

这将检查所有看到的
节点,以防它们再次出现在
下一个
参考中。这实际上使用了
.equals()
.hashCode()
节点的
节点的
,因此它们的实现一致性很重要。

您得到的错误是什么?在我调用递归函数的那一行一直在说一个错误,您必须告诉我们错误是什么,以便我们理解问题是什么。此外,这将始终是真的:`if(slow==fast)`因为在上面的行中,您同时设置了
slow=head
fast=head
“但是我得到一个错误”是没有帮助的。告诉我们错误在哪里(在那一行加上注释),并复制错误的确切文本。否则就帮不了你了。