Java链接列表maxElement递归

时间:2015-01-31 23:04:10

标签: java recursion linked-list

我一直在进行一项任务,现在我必须定义的一种方法是在列表中查找max元素的递归解决方案。我觉得我的解决方案很接近,但我不断插入最后一个元素,而不是最大元素。有人能指出我需要做些什么来解决这个问题吗?       *我被告知不要使用预先构建的类或方法。 *

        int maxElement () {

    if (head == null) {
        return -1;
    }
    else {
        Node current = head;
        return maxElement (current);
    }
}

private int maxElement (Node current) {     
    Node max;
    // If our next node does not exist, our current node has to be max
    if (current.getNext() == null) {
        return current.getKey();
    }
    //  
    else {  

        if (current.getNext().getKey() > current.getKey()) {
            // Assign the larger key as our new max
            max = current.getNext();
            return maxElement (max);
        }
        else {

        }
    }
    return maxElement (max.getNext());
}

3 个答案:

答案 0 :(得分:0)

您必须跟踪递归中的当前最大值:

public Node max() {
    return maxAux(root, null);
}

private Node maxAux(Node current, Node currentMax) {
    if(current == null) {
        return currentMax;
    }
    if(currentMax == null || current.getKey() > currentMax.getKey()) {
        return maxAux(current.getNext(), current);   // current is the new max
    } else {
        return maxAux(current.getNext(), currentMax);
    }
}

答案 1 :(得分:0)

这是一个相当优雅的解决方案:

public Node max(Node node1, Node node2) {
    if (node1 == null || node2 == null)
        return node1;
    else
        return max(node1.getKey() > node2.getKey() ? node1 : node2, node2.getNext());
}

使用max(head, head.getNext())调用它。

如果您特别需要避免将当前最大值传递给方法,那么:

private static Node currentMax;

private Node maxElement(Node node) {
    if (currentMax == null || node == null)
        return currentMax;
    else if (node.getKey() > currentMax.getKey())
        currentMax = node;
    return maxElement(node.getNext());
}

使用currentMax = head;然后maxElement(head)调用此方法。

答案 2 :(得分:0)

private Node head, max;

int maxElement () {

    if (head == null) {
        return -1;
    }
    else {
        Node current = head;
        return maxElement (current);
    }
}

    private int maxElement (Node current) {     

        // If our next node does not exist, our current node has to be max
        if (current.getNext() == null) {
            current = this.max;
            return this.max.getKey();
        }
        //  
        else {  

        if (current.getNext().getKey() > current.getKey()) {
            // Assign the larger key as our new max
            this.max = current.getNext();
            return maxElement (current.getNext());
        }
        else {

        }
    }
    return maxElement (max.getNext());
}