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

时间:2015-11-28 02:20:25

标签: java methods data-structures linked-list overloading

目前我正在创建一种方法来反转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类的其他方面?

提前致谢!

4 个答案:

答案 0 :(得分:5)

有一个公共方法调用带有额外参数的私有递归方法是很常见的。有关此示例,请参阅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 + " ");
}

答案 1 :(得分:3)

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

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 不是一个好主意。 (或者你可能只是得到一个警告,让公共方法接受私人类型的参数,然后你可以压制;我不记得。)

但保罗·博丁顿的评论是正确的。

答案 2 :(得分:2)

保罗打败了我一个类似的答案,但我想我会发布我的,因为我认为你不想使用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] + " ");
    }
}

答案 3 :(得分:1)

是。您可以将显示的第二种方法中的参数“操作”为可选参数。在下面的方法声明中,我们实质上是将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)

编辑:

Whops ......迈克打败了我:)