[英]How can I combine two very similar methods in java which result in two seperate ListArrays?
[英]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.