以相反顺序打印链接列表的递归方法

时间:2011-10-21 22:06:57

标签: java

我在编写一个方法时遇到问题,该方法应接受对通用单链表的引用,并创建测试程序以在字符串列表上测试我的方法(按顺序和反向顺序打印列表) 。我已经创建了一个名为SinglyLinkedList的单链表。

3 个答案:

答案 0 :(得分:13)

如果你考虑递归,你知道你会一遍又一遍地做一些事情。在这种情况下,我们想要反复打印节点,但我们每次都想要一个不同的节点。

我们打印的第一个节点应该是列表中的最后一个节点。这对我来说是一个很好的基础案例。

void printReverse(Node node) {
    if(node.next != null) { // we recurse every time unless we're on the last one
        printReverse(node.next);  // this says "do this to the next node first"
    }
    System.out.println(node.data); // we'll print out our node now
}

考虑一下你是否有

1,2,3,4

您将在节点上调用print,其中包含1。然后会说“我有一个下一个节点,打印出来”。 2节点还具有下一个节点,因此它遵循节点3.节点3仍然具有下一个节点,因此在打印之前它将延迟到节点4。节点4愿意打印自己,因为它没有下一个节点。然后它返回到节点3停止的位置。现在节点3可以打印并返回到节点2停止的位置。它打印并转到节点1停止的位置。它打印并返回主函数。

答案 1 :(得分:6)

对于incom,在递归调用函数之前调用output方法。

void print(Node n)
{
    if ( n != null )
    {
        System.out.println(n.value);
        print(n.next);
    }
}

反过来,先调用函数和输出。

void print(Node n)
{
    if ( n != null )
    {        
        print(n.next);
        System.out.println(n.value);
    }
}

答案 2 :(得分:1)

我同意100%的上述答案,对于我的实施,如果没有帮助类,我无法使用它。我的答案只是扩展上面的答案,以防其他人也遇到编译错误。

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

private void printReverse(GNode<T> node)
{
  if (node.next != null) 
   {
     printReverse(node.next);
   }
  System.out.println(node.data);
}