Java 如何递归地找到链表中的最大值?

Java 如何递归地找到链表中的最大值?,java,recursion,linked-list,Java,Recursion,Linked List,我需要递归地找到链表中的最大值,给定链表的头作为参数。我不知道如何开始该方法的递归部分。到目前为止,我只有这些 int maxOfList(List M){ List max = M; if(M == null) return max; if(M.next > max){ max = M.restOfTheInts; return maxOfList(); } } 在递归中,通常需要entry方法和wor

我需要递归地找到链表中的最大值,给定链表的头作为参数。我不知道如何开始该方法的递归部分。到目前为止,我只有这些

int maxOfList(List M){  
    List max = M;
    if(M == null)
        return max;
    if(M.next > max){
        max = M.restOfTheInts;
        return maxOfList();
    }
}

在递归中,通常需要entry方法和worker方法。entry方法是一种特殊情况,它允许worker方法在所有情况下工作,worker执行递归

例如,您的员工可能是:

int maxOfList(int currentMax, List<int> listToCheck) {
  // Nothing to compare? currentMax is it!
  if (listToCheck == null || listToCheck.size() == 0) return currentMax;

  // Compare and return.
  List<int> restOfList = listToCheck.subList(1, listToCheck.size());
  return maxOfList(Math.max(currentMax, listToCheck.get(0)), restOfList);
}
int-maxOfList(int-currentMax,List-listToCheck){
//没什么可比的?就是它!
如果(listToCheck==null | | listToCheck.size()==0)返回currentMax;
//比较并返回。
List restOfList=listToCheck.subList(1,listToCheck.size());
返回maxOfList(Math.max(currentMax,listToCheck.get(0)),restOfList);
}
然后,要开始,您需要您的输入方法:

int maxOfList(List<int> listToCheck) {
  return maxOfList(Integer.MIN_VALUE, listToCheck);
}
int-maxOfList(List-listToCheck){
返回maxOfList(Integer.MIN_值,listToCheck);
}

在递归中,通常需要一个entry方法和一个worker方法。entry方法是一种特殊情况,它允许worker方法在所有情况下工作,worker执行递归

例如,您的员工可能是:

int maxOfList(int currentMax, List<int> listToCheck) {
  // Nothing to compare? currentMax is it!
  if (listToCheck == null || listToCheck.size() == 0) return currentMax;

  // Compare and return.
  List<int> restOfList = listToCheck.subList(1, listToCheck.size());
  return maxOfList(Math.max(currentMax, listToCheck.get(0)), restOfList);
}
int-maxOfList(int-currentMax,List-listToCheck){
//没什么可比的?就是它!
如果(listToCheck==null | | listToCheck.size()==0)返回currentMax;
//比较并返回。
List restOfList=listToCheck.subList(1,listToCheck.size());
返回maxOfList(Math.max(currentMax,listToCheck.get(0)),restOfList);
}
然后,要开始,您需要您的输入方法:

int maxOfList(List<int> listToCheck) {
  return maxOfList(Integer.MIN_VALUE, listToCheck);
}
int-maxOfList(List-listToCheck){
返回maxOfList(Integer.MIN_值,listToCheck);
}

因此,为了使递归有效地工作,您需要使整个上下文在函数中可见

int maxOfList(List m) {
     if(m.next == null)
          return m;
     int previousMax = maxOfList(m.next);
     if(m > previousMax)
          return m;
     else
          return previousMax;
}

因此,为了使递归有效地工作,您需要使整个上下文在函数中可见

int maxOfList(List m) {
     if(m.next == null)
          return m;
     int previousMax = maxOfList(m.next);
     if(m > previousMax)
          return m;
     else
          return previousMax;
}

这应该非常简单。为了实现递归解决方案,请考虑以下所有步骤:

  • 递归思想是什么?列表的最大值
    {L}
    max(li,{L}-li)
    ,其中
    li
    是当前元素
  • 什么是停止条件?我们知道,如果列表为空,最大值可能是任何数字都会更大的值,比如说
    MIN_INT
  • 综合起来:因此,最后我们可以说伪代码如下所示:
int最大值列表(列表M){
如果(M==null)
返回Integer.MIN_值;
int max=maxOfList(M.next);
返回M.value>max?M.value:max;
}

我假设链表的内容在
value
中,并指向
next
中的下一个元素(尾部指向
null
)。如果您发现任何其他问题,请查看以下帖子:


这应该非常简单。为了实现递归解决方案,请考虑以下所有步骤:

  • 递归思想是什么?列表的最大值
    {L}
    max(li,{L}-li)
    ,其中
    li
    是当前元素
  • 什么是停止条件?我们知道,如果列表为空,最大值可能是任何数字都会更大的值,比如说
    MIN_INT
  • 综合起来:因此,最后我们可以说伪代码如下所示:
int最大值列表(列表M){
如果(M==null)
返回Integer.MIN_值;
int max=maxOfList(M.next);
返回M.value>max?M.value:max;
}

我假设链表的内容在
value
中,并指向
next
中的下一个元素(尾部指向
null
)。如果您发现任何其他问题,请查看以下帖子:


到目前为止,您所拥有的内容是否适用于长度为1的列表?如果没有,不要尝试考虑递归的情况。(提示:不,不适用)到目前为止,您所拥有的内容是否适用于长度为1的列表?如果没有,不要尝试考虑递归的情况。(提示:不,它不是)这真的只需要作为一个优化,如果它将是尾部调用优化。没有尾部调用优化,就不需要助手方法。这是一个原因。另一个原因是递归方法的签名几乎总是带有一个仅用于递归的参数。在本例中,
currentMax
是一个公共API不需要知道的参数。我的观点是,您根本不需要该参数,因此也不需要帮助器。递归调用只是
返回max(node.value,maxOfList(node.tail))
很好。我想我对列表为null或为空是特别防御性的。如果它是尾部调用优化的,那实际上只需要作为优化。没有尾部调用优化,就不需要助手方法。这是一个原因。另一个原因是递归方法的签名几乎总是带有一个仅用于递归的参数。在本例中,
currentMax
是一个公共API不需要知道的参数。我的观点是,您根本不需要该参数,因此也不需要帮助器。递归调用只是
返回max(node.value,maxOfList(node.tail))
很好。我想我对列表为null或为空的问题特别谨慎。您可能需要提供一个
list.next
的实现来充分解释这一点。Paul同意。我的答案只是一个简单的算法解决方案。在我看来,Java语言的实现应该留给cee来让他有效地理解递归。您可能需要提供
列表的实现。接下来
来充分解释这一点。Paul同意。我的回答只是简单的回答