Java中链接列表的递归最大值

时间:2013-06-19 14:06:37

标签: java recursion linked-list max

要学习递归并编写自定义链表(而不是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

4 个答案:

答案 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,但通过查找最大值的列表会更加简单。事实上,我想不出我曾经通过列表递归的时间。对于迭代,您可以使用iteratorfor(简单和增强),whiledo(可能还有其他一些)。

如果您希望了解递归,我建议您构建一个树结构并进行处理。 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));
    }
}