包含(int aData)和递归链表Java

包含(int aData)和递归链表Java,java,recursion,linked-list,Java,Recursion,Linked List,我在尝试检查一个值是否在链表中或不使用递归时遇到问题。链接列表中的值介于0和5之间。如果该值在链表中,则该方法应返回true。然而,如果该值确实在链接列表中,我会得到全面的答案。有些数字将返回false,有些将返回true。我不知道它为什么这样做。谢谢 public boolean contains(int aData) { Node currentNode = firstNode; if(currentNode == null) { return false;

我在尝试检查一个值是否在链表中或不使用递归时遇到问题。链接列表中的值介于0和5之间。如果该值在链表中,则该方法应返回true。然而,如果该值确实在链接列表中,我会得到全面的答案。有些数字将返回false,有些将返回true。我不知道它为什么这样做。谢谢

public boolean contains(int aData)
{
    Node currentNode = firstNode;
    if(currentNode == null) {
        return false;
    }
    if(currentNode.data == aData) {
        return true;
    }
    else {
        return false;
    }
}

如前所述,您没有使用递归,只检查第一个节点。如果您想使用递归,您需要从contains方法中调用
contains
方法,而您目前没有这样做。即使您只是在方法的末尾调用它,它仍然不会做任何事情-想想如果方法启动,您可能会如何重写它:

public boolean contains(int aData, Node nodeToCheck)

您只检查一个节点(第一个节点)。您将需要这样的东西:

public boolean contains(int aData, Node node)
{
    Node currentNode = node;
    // base case; if this node is null, return false
    if(currentNode == null) {
        return false;
    }
    // if this node contains the data, return true, otherwise, check next nodes.
    if(currentNode.data == aData) {
        return true;
    } else {
        return contains(aData, currentNode.next);
    }
}
您可以从head节点开始调用上述函数

contains(5, headNode);

它将在您的整个列表中运行,直到a)找到数据,或b)用尽所有选项而找不到数据。

递归有一种定义良好的形式,几乎在所有情况下都会使用。其基本形式是:

type method(context) {
    if (one of the base cases holds)
        return appropriate base value
    else
        for each possible simpler context
            return method(simpler context);
}
这是通过逐步将问题分解成更小的部分来实现的,直到问题非常简单,有了明显的答案(即基本情况)。使用递归的关键是问自己“在什么情况下答案是明显的”(即基本情况)和“当答案不明显时,如何简化情况使其更明显?”。在回答这些问题之前不要开始编码

在您的案例中,您有两个基本案例:您已经到达列表的末尾,或者您已经找到了值。如果这两种情况都不成立,请在更简单的上下文中重试。在您的例子中,只有一个更简单的上下文:一个较短的列表

将所有这些结合起来:

public boolean contains(Node node, int data) {
    if (node == null)
        return false;
    else if (node.value == data)
        return true;
    else
        return contains(node.next, data);
}

只有当第一个节点包含该值时,才会返回
true
。考虑一下如何对列表中的所有节点执行此检查?提示:您需要另一个助手方法来递归地执行此操作。递归在哪里?不要猜测,调试。这不应该编译。如果所有
if
语句都失败,它就没有返回语句。为什么我没有想到这一点?谢谢大家!@凯瑟·斯普林特发现了这个错误,我在那里修复了它。downvoter能解释一下downvote吗?没有发现任何错误,所以+1。最后一条语句可以简化为
return currentNode.data==aData | | contains(aData,currentNode.next)。你可以把这整件事做一行,但那很简单,我想是的。关于否决票:你们两个正在做这家伙的家庭作业。因为代码甚至不包含任何递归,所以现在不是提供复制粘贴代码的时候。请注意,我不是在批评你的答案本身,而是打算撤销否决票:)