有什么办法可以结合这两种方法吗?
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方法,然后调用另一个reverse方法。有什么方法可以在不改变我的 LinkedList 的其他方面的情况下使它们成为一种方法 class?
提前致谢!
从技术上讲,有一种方法,但我不推荐它。就是这样:
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 + " " );
}
请注意,这还需要制作 class Node
public,即 also 不是什么好主意。 (或者您可能只是因为 public 方法接受私有类型的参数而收到警告,然后您可以抑制该参数;我不记得了。)
但 Paul Boddington 的评论是对的。
public 方法调用带有额外参数的私有递归方法是很常见的。有关此示例,请参阅 Arrays.deepToString(Object[])
的源代码。
但是,在您的情况下,最好完全避免递归。递归的一个问题是,在获得 WhosebugError
.
之前,您只能将方法调用嵌套到一定深度
另一种方法是使用循环。以下将起作用:
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 + " ");
}
是的。您可以将显示的第二个方法中的参数 "act" 作为可选参数。在下面的方法声明中,我们实质上是将 Node Type 参数设为可以作为空值传递的 Node 数组。由于我们只需要将 1 个参数传递给我们的方法,因此我们只需要包含在元素索引 0(数组的第一个元素)中的提供的节点数据。
在方法本身中,我们声明了一个与您的参数具有相同类型和名称的 Node 变量,以消除方法代码主体中的任何混淆,我们提供了一个 default of 0(默认可以是任何你想要的)。然后我们检查新的 headerInfo[] 数组参数以查看是否提供了任何内容,如果有则我们将 headerInfo[] 数组的第一个元素中的数据应用到(因为我们只为该方法使用一个参数)到新节点类型变量 h。 class 中 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) 方法
编辑:
哎呀...Mike 抢先了我:)
Paul 先于我给出了类似的答案,但我认为无论如何我都会 post 我的答案,因为我假设您不想将 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] + " ");
}
}
目前我正在创建一种方法来反转 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方法,然后调用另一个reverse方法。有什么方法可以在不改变我的 LinkedList 的其他方面的情况下使它们成为一种方法 class?
提前致谢!
从技术上讲,有一种方法,但我不推荐它。就是这样:
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 + " " );
}
请注意,这还需要制作 class Node
public,即 also 不是什么好主意。 (或者您可能只是因为 public 方法接受私有类型的参数而收到警告,然后您可以抑制该参数;我不记得了。)
但 Paul Boddington 的评论是对的。
public 方法调用带有额外参数的私有递归方法是很常见的。有关此示例,请参阅 Arrays.deepToString(Object[])
的源代码。
但是,在您的情况下,最好完全避免递归。递归的一个问题是,在获得 WhosebugError
.
另一种方法是使用循环。以下将起作用:
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 + " ");
}
是的。您可以将显示的第二个方法中的参数 "act" 作为可选参数。在下面的方法声明中,我们实质上是将 Node Type 参数设为可以作为空值传递的 Node 数组。由于我们只需要将 1 个参数传递给我们的方法,因此我们只需要包含在元素索引 0(数组的第一个元素)中的提供的节点数据。
在方法本身中,我们声明了一个与您的参数具有相同类型和名称的 Node 变量,以消除方法代码主体中的任何混淆,我们提供了一个 default of 0(默认可以是任何你想要的)。然后我们检查新的 headerInfo[] 数组参数以查看是否提供了任何内容,如果有则我们将 headerInfo[] 数组的第一个元素中的数据应用到(因为我们只为该方法使用一个参数)到新节点类型变量 h。 class 中 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) 方法
编辑:
哎呀...Mike 抢先了我:)
Paul 先于我给出了类似的答案,但我认为无论如何我都会 post 我的答案,因为我假设您不想将 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] + " ");
}
}