首页 > 解决方案 > 以递归方法更新引用的值 - 最佳实践

问题描述

我试图了解如何以更好的方式更新 Java 方法中的引用变量。我知道 Java 引用是按值传递的 - 换句话说,如果我在方法中更改引用的值,它不会将它保留在调用方方法中。但与此同时,我也在尝试了解如何更好地处理这些情况。在大多数情况下,我们需要从递归方法中返回值,比如它的基本情况,就像下面我求助于维护一个静态变量来保存正在反转的链表的新头部一样。我可以在这里使用哪些更明智的选择?

public static LinkedList _head = null;
    public static LinkedList reverseLinkedList(LinkedList head) 
    {
        reverseLinkedListInternal( head );
        return _head;
    }
    
    public static LinkedList reverseLinkedListInternal( LinkedList node )
    {
        if( node.next == null )
        {
            _head = node;
            return node;
        }

        LinkedList tmp = reverseLinkedListInternal( node.next );
        tmp.next = node;
        node.next = null;
    
        return node;
    }

标签: javarecursionlinked-list

解决方案


您只是不需要这里的静态变量。您应该只使用返回值,而目前它只是被忽略了。

这是我要写的那种解决方案。显然,这可能不属于您的练习的限制,因为它被写成好像它是 a 的方法LinkedList,这在现实世界中会更有意义。然而,这个概念是相同的,所以希望它能帮助你发现你的错误。

public void reverse() {

    reverseInternal(head);
}

public Node reverseInternal(Node node) {

    if (node.next == null) {

        return node;
    }

    Node reversedTail = reverseInternal(node.next);
    reversedTail.next = node;
    node.next = null;

    return reversedTail;
}

推荐阅读