【问题标题】:My recursion find(T data) method is resizing my LinkedList..how do I stop that?我的递归 find(T data) 方法正在调整我的 LinkedList 的大小。我该如何阻止它?
【发布时间】:2012-03-14 02:54:16
【问题描述】:

我需要为使用递归的 LinkedList 创建一些方法。 我有一些很好,但这是给我带来麻烦的其中之一:

public boolean find(T data){    
    if(head == null)
        return false;
    else{
        if(head.data == data)
            return true;
        else{
            head = head.next;
            return find(data);
        }
    }
}

它应该在 LinkedList 中找到一个元素,但问题是,不应该附加 List,这显然是我的头部位置增加。 原型应该有1个参数,数据1。我怎样才能让它停止增加头部位置?

【问题讨论】:

    标签: java recursion linked-list


    【解决方案1】:

    您需要维护对当前节点的单独引用;不要使用head。我会使用辅助方法来做到这一点。

    public boolean find(T data){    
        return find(data, head);
    }
    
    private boolean find(T data, Node current) {
        if (current == null) return false;
        if (current.data.equals(data)) return true;
        current = current.next;
        return find(data, current);
    }
    

    注意在比较data 值时使用.equals() 而不是==。我假设head 属于Node。如果这不是正确的猜测,请填写您的实现中的实际类。

    【讨论】:

    • equals() 有影响吗?
    • 一般来说:是的。不过,它确实取决于T 的具体类型。如果T 是一个不覆盖.equals() 的类,则没有区别。见stackoverflow.com/questions/7520432/java-vs-equals-confusion
    • 好的。我也不确定第一种方法的相关性是什么。有了第二个,看起来我们甚至不需要第一个,对吧?
    • 这是关于您公开供世界其他地方使用的 API。正确 - 您可以只使用第二种方法。但就像你说的:“原型应该有 1 个参数,一个数据。” 更好的 API 设计是对那些使用你的代码的人隐藏 current 参数。跨度>
    • 听起来你明白了。 :) 如果您认为您的问题已解决,您介意accepting this answer吗?
    【解决方案2】:

    除非您对使用递归的要求很严格,否则我建议您使用迭代来遍历列表。递归是低效的,因为它会创建不必要的函数堆栈。

    递归对于简化非线性遍历或数据结构的代码很有用。

    使用迭代的相同代码如下所示。

    public boolean find(T data) {
    
        boolean found = false;
        T current = head;   
    
        while(current != null) {
    
            if(current.data.equals(data)) {
    
                found = true;
                break;
            }
    
            current = current.next;
        }
    
        return found;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2017-04-22
      • 2014-07-08
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 2019-02-23
      • 2011-03-21
      相关资源
      最近更新 更多