此处的初学者使用Java(一年级学生),无法使用以下功能。目标是使用递归和辅助函数来计算单链表的大小。针对测试列表运行代码时,它会继续返回List changed to []
。
我通常在Java方面苦苦挣扎,因此可以提供任何帮助。谢谢
public class MyLinked {
static class Node {
public Node(double item, Node next) {
this.item = item;
this.next = next;
}
public double item;
public Node next;
}
int N;
Node first;
public int sizeForward() {
return sizeForwardHelper(first);
}
public int sizeForwardHelper(Node n) {
Node current = first;
if (current == null) {
return 0;
} else {
first = first.next;
return sizeForward() + 1;
}
}
我相信我已经将第一部分设置为如果列表中没有元素,则返回0。我相信这是第二部分设置不正确?
谢谢
答案 0 :(得分:4)
因为对您的学习至关重要,所以不要一feed而就,因此,我将介绍一种方法而不是提供代码。
使用这个事实:
从任何给定节点到末尾的列表长度为1加上从下一个节点测量的长度(如果有)。
通常(如此处所示),递归函数采用以下形式:
编写递归函数时,首先要确定终止条件。在这种情况下,n == null
是显而易见的选择,您将返回0
,因为您已经用尽了列表的末尾,并且没有内容(即无节点)的长度也没有了。这也可以处理空列表(当first
为null
时),而无需任何特殊代码。
否则,返回1
(一个节点的长度)加上next
的长度。
将它们放在一起,您将得到答案。
-
提示:如果使用三元表达式,则可以使用短行对递归帮助器方法的主体进行编码。
答案 1 :(得分:1)
不是递归调用包装函数,而是递归调用帮助函数。请尝试以下操作:
public int sizeForward () {
return sizeForwardHelper (first);
}
public int sizeForwardHelper(Node n) {
if (n == null) // base case
return 0;
return sizeForwardHelper(n.next) + 1; // count this node + rest of list
}
答案 2 :(得分:0)
您计算列表大小的方法实际上会修改流程中的列表(使用first = first.next;
,您将第一个元素设置为下一个,并且由于存在递归,因此第一个元素始终最终为null这相当于您的设计中有一个空列表)。您的方法将只工作一次,但之后您的列表将为空。
为了说明这一点,我在指令first = first.next;
旁边添加了打印件,并编写了以下主要内容:
public static void main(String[] args) {
Node n2 = new Node(2d, null);
Node n1 = new Node(1d, n2);
Node n = new Node(0, n1);
MyLinked l = new MyLinked(n);
System.out.println("The first element is: "+l.first.item);
System.out.println("The size is: "+l.sizeForward());
System.out.println("The first element is: "+l.first);
}
它产生:
The first element is: 0.0
first is set to 1.0
first is set to 2.0
first is set to null
The size is: 3
The first element is: null
很明显,在计算列表大小时,您不应修改列表。如果节点为空(空列表),则helper方法应返回0,否则返回1加列表其余部分的大小。这是代码。
public int sizeForwardHelper(Node n) {
if (n == null)
return 0;
else
return sizeForwardHelper(n.next) +1;
}
无参方法sizeForward()
的目标只是调用帮助程序。助手不应该使用它。