【问题标题】:Recursive sum function for a linked list in javajava中链表的递归求和函数
【发布时间】:2021-03-16 17:58:40
【问题描述】:

我想递归地总结一个链表的所有值,但它不起作用。它说:

无法调用“Element.sum()”,因为“Element.getNext()”的返回值为空

public class Element{
    private int value;
    private Element next;
}

public class MyList{
    private Element elements;
    public int sum(){
        if (elements == null) return 0;
            return elements.getValue() + elements.getNext().sum();
        }
    }
}

【问题讨论】:

  • “Element.getNext() is null”有什么不清楚的地方?
  • 当列表包含 1 个元素时它不起作用。
  • 假设您在最后一个元素上,然后 element.getNext() 为 null 并且您尝试在该 null 上调用 sum() 因此您的错误,甚至在您调用任何之前添加一个 null 检查到 getNext()其他功能。
  • “当列表包含 1 个元素时它不起作用” - 是的,因为代码试图获取下一个不存在的元素(它为空)。问题是什么?
  • 但是如果下一个为空,则有一个 if 子句应该返回

标签: java recursion linked-list sum


【解决方案1】:

这里有一个解决方案:

public class MyList{

    private Element elements;
    
    class Element{
        private int value;
        private Element next;
        Element(int value) {
            this.value = value;
        }
        public Element getNext() {
            return next;
        }
        public int getValue() {
            return value;
        }
        public void setNext(Element next) {
            this.next = next;
        }
        public int sum() {
            if (next == null) {
                return value;
            } else {            
                return value + next.sum();
            }
        }
    }

    public MyList(int data[]) {
        Element prev = null;
        for (int value : data) {
            Element e = new Element(value);
            if (prev == null) {
                elements = e;
            } else {
                prev.setNext(e);
            }
            prev = e;
        }
    }
    
    public int sum() {
        return elements == null ? 0 : elements.sum();
    }
    
    public static void main(String args[]) {
        MyList list = new MyList(new int[]{ 1, 2, 3});
        System.out.printf("sum = %d\n", list.sum());
    }
}

【讨论】:

    【解决方案2】:

    您似乎正在尝试学习递归,并且您似乎确实在尝试,所以我不会在这里给您一个完整的解决方案。

    首先我认为您没有提供完整的代码,因为它无法编译。您正在调用 elements.getNext().sum(),这意味着您的类 Element 上有一个 sum() 方法。

    这实际上是一种可能的正确方法,在您的 Element 类中有一个 sum 方法,因为您希望在每个 Element 上都发生递归。

    因此,当您以这种方式开始时,您应该继续尝试这种方式:在您的 Element 类上添加一个 sum 方法。这就是你可以进行递归的地方。递归意味着在另一个实例上或使用另一个参数再次调用相同的方法...

    另一个答案有效,但你会通过复制它来了解递归吗?我建议尝试做类似的事情,但是在 Element 类中,所以你可以自己做

    【讨论】:

    • 你是对的,我正在尝试学习递归。类元素确实包含 sum 方法和 getter。我没有提到它,因为我不知道当我在来自 Mylist 的元素上使用 getnext() 时,它会返回类元素的实例,并且调用来自类元素的 sum() 函数而不是 Mylist。我说的对吗?
    • 没错,getNext()方法返回一个Element,所以getNext().sum()是在getNext()返回的Element上调用sum方法
    • 感谢您的回复。我慢慢明白了:)
    • 这就是为什么我没有像其他人那样给出解决方案。最好进行问答讨论,以便您逐步理解,而不是给出完整的解决方案:) 他们甚至没有花时间解释,当我们学习时,我猜这并没有太大帮助......
    • 我同意向别人扔解决方案不会帮助他们充分理解
    【解决方案3】:

    sum 甚至不是Element 的方法,因此不应该编译实现。

    我会将根元素传递给可以递归的内部 sum 方法,并保持无参数 sum 方法公开:

    public class MyList {
        private Element elements;
    
        public int sum() {
            return sum(elements);
        }
    
        private int sum(Element e) {
            if (e == null) {
                return 0;
            }
            return e.getValue() + sum(e.getNext());
        }
    }
    

    【讨论】:

    • == 0 应该是 == null - 我猜是错字。
    • @kaya3 一时注意力不集中,感谢您的关注!已编辑和修复。
    【解决方案4】:
    public class Foo {
    
        public static void main(String[] args) {
            MyList myList = new MyList();
    
            for (int i = 1; i <= 10; i++)
                myList.add(i);
    
            System.out.println(myList.sum());   // 55
        }
    }
    
    final class MyList {
    
        private Element head;
    
        public void add(int value) {
            if (head == null)
                head = new Element(value);
            else {
                Element element = head;
    
                while (element.next != null)
                    element = element.next;
    
                element.next = new Element(value);
            }
        }
    
        public int sum() {
            return head == null ? 0 : head.sum();
        }
    
        private static final class Element {
    
            private final int value;
            private Element next;
    
            public Element(int value) {
                this.value = value;
            }
    
            public int sum() {
                return value + (next == null ? 0 : next.sum());
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-04
      • 2019-11-15
      • 2014-04-08
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      相关资源
      最近更新 更多