繁体   English   中英

有没有办法将这两种方法结合起来?

[英]Is there a way I can combine these two methods?

目前我正在创建一种方法来反转java中的链表,但它需要两种方法:

public void reverse(){
    reverse(head);
}

private void reverse(Node h){
    if(h.next==null){
        System.out.print(h.data+" ");
        return;
    }

    reverse(h.next);
    System.out.print(h.data+" ");   
}

这样我用0参数调用reverse方法,然后调用另一个反向方法。 有没有办法让他们1方法而不改变我的LinkedList类的其他方面?

提前致谢!

有一个公共方法调用带有额外参数的私有递归方法是很常见的。 有关此示例,请参阅Arrays.deepToString(Object[])的源代码。

但是,在您的情况下,最好完全避免递归。 递归的一个问题是,在获得StackOverflowError之前,您只能将方法调用嵌套到某个深度。

另一种方法是使用循环代替。 以下将有效:

public void reverse(){
    List<Node> nodes = new ArrayList<>();
    for (Node n = head; n != null; n = n.next)
        nodes.add(n);
    for (int i = nodes.size() - 1; i >= 0; i--)
        System.out.print(nodes.get(i).data + " ");
}

从技术上讲,有一种方法,但我不推荐它。 就是这个:

public void reverse( Node... nodes )
{
    Node h;
    if( nodes.length == 0 )
        h = head;
    else
    {
        assert nodes.length == 1;
        h = nodes[0];
    }

    if( h.next == null )
    {
        System.out.print( h.data + " " );
        return;
    }

    reverse( h.next );
    System.out.print( h.data + " " );   
}

注意,这也将需要使课堂Node公开的,这也不是一个好主意。 (或者你可能只是得到一个警告,让公共方法接受私有类型的参数,然后你可以压制;我不记得了。)

但保罗·博丁顿对这笔钱的评论是正确的。

保罗打败了我一个类似的答案,但我想我会发布我的,因为我认为你不想使用ArrayList作为依赖:

对的,这是可能的。 如果它是双向链表,您可以遍历列表到最后一个节点,然后将列表移到前面。 但是,我还假设它是一个单独的链表,所以我将回答使用数组存储所有节点引用。 另外,我假设你有另一种计算长度的方法。

public void reverse() {
    int length = length();
    Node [] nodes = new Node[length];
    Node currentNode = head;

    int i = 0;
    // Populate the array
    while(currentNode != null)
    {
        nodes[i] = currentNode;
        currentNode = currentNode.next;
        i++;
    }

    // Iterate backwards to print the array
    for(int j = length -1; j >= 0; j--)
    {
        System.out.println(nodes[i] + " ");
    }
}

是。 您可以将显示的第二种方法中的参数“操作”为可选参数。 在下面的方法声明中,我们实质上是将Node Type参数设置为可以作为空传递的Node数组。 由于我们只需要将1个参数传递给我们的方法,因此我们只需要元素Index of 0(数组的第一个元素)中包含的提供的Node数据。

在方法本身中,我们声明一个Node变量,它与您的参数的类型和名称相同,以消除方法代码体内的任何混淆,我们提供默认值 0(默认值可以是您想要的任何值)。 然后我们检查新的headerInfo []数组参数以查看是否有任何提供的内容,如果有,那么我们从headerInfo []数组的第一个元素应用该数据(因为我们只使用此方法的一个参数)新的Node类型变量h 类中main方法的args []参数执行相同的操作。

public void reverse(Node... headerInfo){
    Node h = 0;
    if (headerinfo.length != 0) { h = headerInfo[0]; } 

    if(h.next==null){
        System.out.print(h.data+" ");
        return;
    }

    reverse(h.next);
    System.out.print(h.data+" ");   
}

现在该方法可以被称为reverse()或reverse(head)

编辑:

哎呀......迈克打败了我:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM