要学习递归并编写自定义链表(而不是LinkedList
中的java.util
),我尝试按如下方式创建递归max()
方法。我不得不挣扎一下,但终于让它运转了。但是,我不确定这是否是正确的方法(或最简单的方法)。首先,我不太确定基本情况。我已将基本案例设置为列表中的最后一个节点。这是应该做的吗?请告诉我如何编写一个简单的递归最大方法..
class ListNode{
int item;
ListNode next;
}
class RecursiveMax{
public static int max(ListNode node,int maxValue){
//is this the base case ?
//if last node reached return the current maxValue
if(node==null){
return maxValue;
}else{
int v = node.item;
if(v > maxValue){
return max(node.next,v);
}else{
return max(node.next,maxValue);
}
}
}
public static void main(String[] args) {
ListNode a = new ListNode();
a.item = 11;
ListNode b = new ListNode();
b.item = 9;
ListNode c = new ListNode();
c.item = 21;
ListNode d = new ListNode();
d.item = 17;
a.next = b;
b.next = c;
c.next = d;
System.out.println("max value in linkedlist="+max(a,0));
}
}
链接列表a-b-c-d
的(值为11,9,21,17
)
输出是
max value in linkedlist=21
答案 0 :(得分:3)
嗯,您开始使用0
作为main
中的当前最大值进行搜索。当所有值负数时会发生什么?
我认为你可以做得更好。使用两个参数private
调用max方法。然后,展示只接受max
的<{1}}。
ListNode
最后,在public static int max(ListNode node) {
//max value is its value.
if (node == null) {
return Integer.MIN_VALUE;
}
return max(node, node.item);
}
private static int max(ListNode node,int maxValue){
int v = node.item;
if(v > maxValue){
return max(node.next,v);
}else{
return max(node.next,maxValue);
}
}
,您只需致电main
答案 1 :(得分:2)
首先,不要让你的班级静止。 darijan的建议很好,我更喜欢抛出异常而不是返回任何设定值,因为返回Interger.MIN_VALUE是不明确的。您不知道这是否是最大值,或者列表中是否没有项目。
所以我建议:
public class linklist {
class ListNode {
int item;
ListNode next;
}
ListNode root;
public linklist() {
this.root = null;
}
public void add(ListNode node){ /*...*/}
public int getMax() {
if (root == null)
throw new NullPointerException("No items in list");
return getMaxFrom(this.root, this.root.item);
}
int getMaxFrom(ListNode node, int maxValue) {
if (node == null)
return maxValue;
else {
return getMaxFrom(node.next, Math.max(node.item, maxValue));
}
}
}
答案 2 :(得分:1)
从纯粹的技术角度来看,你所拥有的一切都很好。第一条评论中提出的改进是我要做的,但这只会略微提高可读性。
尽管使用interation,但通过查找最大值的列表会更加简单。事实上,我想不出我曾经通过列表递归的时间。对于迭代,您可以使用iterator
,for
(简单和增强),while
和do
(可能还有其他一些)。
如果您希望了解递归,我建议您构建一个树结构并进行处理。 XML是树结构的一个很好的例子,它可以让你接触XML处理,这些处理最终会在某一天完成。
答案 3 :(得分:0)
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class RecursionUtils extends Object {
public static final int findMaxRecursively(List<Integer> numbers) {
if (numbers.size() > 0) {// terminating condition... if there are no
// elements remaining in the list then
// return 0..
int num1 = numbers.remove(0); // remove the first element of the
// list, thus in the process we
// truncate the list by one element.
int num2 = findMaxRecursively(numbers); // find the max from the
// rest of the list..
return num1 > num2 ? num1 : num2;
} else
return 0;
}
public static void main(String[] args) {
List<Integer> numbers = new LinkedList<>();
numbers.addAll(Arrays
.asList(new Integer[] { -1, -2, -3, 0, 6, 5, 3, 2 }));
System.out.println("The entered list is :");
System.out.println(numbers);
System.out.println("\nThe max element is : "
+ findMaxRecursively(numbers));
}
}