使用递归方法返回链接列表中具有最大值的对象

时间:2017-04-05 18:34:21

标签: java recursion linked-list nodes

我有一个自定义链表,Student对象存储为Node对象。我有一个方法,public Student worstStudentRec(Node list)采用头Node(列表)并递归查找包含{em> GPA 最高的Student的节点。我的代码可以用于此目的,但我对是否可以更改方法代码以使其工作而不在该类之外声明变量感到困惑。例如,我声明private Node baseCase用作包含最低GPA Student的节点,并用worstStudent作为我的最终返回变量。我完全陷入困境,无法判断是否可以在不在方法之外声明这些变量的情况下完成此操作。 我的方法代码如下。谢谢!

  private Node baseCase = new Node (new Student ("", Double.MAX_VALUE, 0));
  private Student worstStudent;
  public Student worstStudentRec(Node list)
  {
    if (list == null)
      return worstStudent;
    else if (list.next == null)
        return worstStudent;
    else
      worstStudent = (baseCase.data.compareTo(list.data) <= 0) ? baseCase.data : list.data; 
      baseCase = (baseCase.data.compareTo(list.data) <= 0) ? baseCase : list;
      return worstStudentRec(list.next);
  }

2 个答案:

答案 0 :(得分:1)

是的,你可以避免在外面宣布这些......

对于最差的学生,您可以传递另一个变量worsTudentNode。因此,在方法中检查当前学生是否比之前的worstStudent更差。如果是,则将当前学生传递给下一个递归调用,否则使用前一个。

这是一个伪代码

public Student worstStudentRec(Node list, Node worstStudent)
  {
    if (list == null || list.next == null)
      return worstStudent;
    else{
      worstStudent = compare with current and add the worse
      return worstStudentRec(list.next, worstStudent);
   }
  }

答案 1 :(得分:0)

你可以:

  public Student worstStudentRec(Node list)
  {
    if (list == null)
      return null;  // add null-handling
    else if (list.next == null)
        return list.data;

    Node theWorstFromOthers = worstStudentRec(list.next);
    return (list.data.compareTo(theWorstFromOthers.data) <= 0) ? list.data : theWorstFromOthers.data;
  }

使用递归时 - 请记住,不仅可以链式执行,还可以进行计算。换句话说 - 您可以(并且在许多情况下)应该在计算中使用递归结果。