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