目前我正在创建一种方法来反转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类的其他方面?
提前致谢!
答案 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 ......迈克打败了我:)