有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java中链表的递归和函数

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

Cannot invoke "Element.sum()" because the return value of "Element.getNext()" is null

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();
        }
    }
}

共 (4) 个答案

  1. # 1 楼答案

    sum甚至不是Element的方法,所以实现不应该编译

    我将根元素传递给一个可以递归的内部sum方法,并将no-argsum方法保持为公共:

    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());
        }
    }
    
  2. # 2 楼答案

    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());
            }
        }
    }
    
  3. # 3 楼答案

    因为你们似乎在尝试学习递归性,而且你们似乎真的在尝试,所以我不会在这里给你们一个完整的解决方案

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

    这实际上是一种可能的正确方法,在元素类中有一个sum方法,因为你希望递归性发生在每个元素上

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

    另一个答案是可行的,但是你会仅仅通过复制它来学习递归性吗?我建议尝试做类似的事情,但是在元素类中,所以你可以自己做

  4. # 4 楼答案

    这里有一个解决方案:

    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());
        }
    }