繁体   English   中英

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

[英]Recursive method that prints a linked list in reverse order

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

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

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

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停止的位置。 它打印并返回主函数。

对于有序,在重新调用函数之前调用输出方法。

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);
    }
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM