使用递归/帮助函数计算链接列表的大小-Java

时间:2018-06-25 16:40:10

标签: java recursion

此处的初学者使用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。我相信这是第二部分设置不正确?

谢谢

3 个答案:

答案 0 :(得分:4)

因为对您的学习至关重要,所以不要一feed而就,因此,我将介绍一种方法而不是提供代码。

使用这个事实:

  

从任何给定节点到末尾的列表长度为1加上从下一个节点测量的长度(如果有)。

通常(如此处所示),递归函数采用以下形式:

  1. 如果终止条件为真,则返回一些值
  2. 否则,返回一些值加上递归计算的值

编写递归函数时,首先要确定终止条件。在这种情况下,n == null是显而易见的选择,您将返回0,因为您已经用尽了列表的末尾,并且没有内容(即无节点)的长度也没有了。这也可以处理空列表(当firstnull时),而无需任何特殊代码。

否则,返回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()的目标只是调用帮助程序。助手不应该使用它。