java中链表的递归求和函数

java中链表的递归求和函数,java,recursion,linked-list,sum,Java,Recursion,Linked List,Sum,我想递归地总结一个链表的所有值,但它不起作用。它说: 无法调用Element.sum,因为Element.getNext的返回值为null 公共类元素{ 私有int值; 其次是私人因素; } 公共类MyList{ 私人要素; 公共整数和{ 如果元素==null,则返回0; 返回elements.getValue+elements.getNext.sum; } } } sum甚至不是元素的方法,因此实现不应该编译 我将根元素传递给可以递归的内部sum方法,并将no-arg sum方法保持为公共:

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

无法调用Element.sum,因为Element.getNext的返回值为null

公共类元素{ 私有int值; 其次是私人因素; } 公共类MyList{ 私人要素; 公共整数和{ 如果元素==null,则返回0; 返回elements.getValue+elements.getNext.sum; } } } sum甚至不是元素的方法,因此实现不应该编译

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

公共类MyList{ 私人要素; 公共整数和{ 返回元素; } 私人住宅{ 如果e==null{ 返回0; } 返回e.getValue+sume.getNext; } }
由于您似乎正在尝试学习递归性,而且您似乎真的在尝试,所以这里我不会给您一个完整的解决方案

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

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

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

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

这里有一个解决方案:

公共类MyList{ 私人要素; 类元素{ 私有int值; 其次是私人因素; Elementint值{ 这个值=值; } 公共元素getNext{ 下一步返回; } 公共整型getValue{ 返回值; } 公共无效设置下一个远程事件{ this.next=next; } 公共整数和{ 如果next==null{ 返回值; }否则{ 返回值+next.sum; } } } 公共MyList数据[]{ 元素prev=null; 对于int值:数据{ 元素e=新元素值; 如果prev==null{ 元素=e; }否则{ prev.setNexte; } prev=e; } } 公共整数和{ 返回元素==null?0:elements.sum; } 公共静态字符串参数[]{ MyList list=newmylistnewint[]{1,2,3}; System.out.printfsum=%d\n,list.sum; } }
关于Element.getNext有什么不清楚的地方?当列表包含1个元素时,它不起作用。假设您位于最后一个元素上,那么Element.getNext为null,并且您试图调用该null的sum,因此出现错误,甚至在调用getNext上的任何其他函数之前,也要向getNext添加null检查。当列表包含1个元素时,该检查不起作用-是,因为代码试图获取下一个不存在的元素,该元素为null。问题是什么?但是有一个if子句应该返回,如果下一个为null==0,那么应该是==null-我猜是打字错误。@kaya3暂时注意力不集中,谢谢注意!编辑和修复。谢谢你帮了我很多忙。你是对的,我正在努力学习递归。class元素确实包含sum方法和getter。我没有提到它,因为我不知道当我在元素上使用getnext时,它会返回class元素的一个实例,并且调用class元素的sum函数而不是Mylist。我说的对吗?是的,这是正确的,getNext方法返回一个元素,因此getNext.sum正在对getNextthank返回的元素调用sum方法以获得响应。我慢慢明白了:这就是为什么我没有像其他人一样给出解决方案。最好是进行问答式讨论,让你一步一步地理解,而不是给出一个完整的解决方案:他们甚至没有花时间解释,这对我们学习没有多大帮助,我想……我同意把解决方案扔给别人不会帮助他们完全理解
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());
        }
    }
}