递归打印循环链接列表

时间:2013-10-22 14:12:57

标签: java recursion printing linked-list

在我的一个教程中,我被这个问题困扰了:

给定一个只有尾指针的循环链表,写一个带有以下标题的递归方法,从第一个元素开始递归打印出列表:

public void circularPrint()

如果没有说明从第一个元素开始打印出列表,我可以很容易地做到这个问题。但由于这个问题强制执行的多重限制,我感到难过。有人可以告诉我如何解决这个问题吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

列表只有一个圆圈,就像循环缓冲区一样?然后,您可以打印,直到下一个指针与列表的引用相同。

如果圈子可以放在任何前一个元素中,那么您需要应用Turtoise and hare algorithms之一。

单链表很容易。如果您有类似Scheme cons的单元格可以在两个指针中都有结构,这需要相当多的回溯和内务管理,那就不那么容易了。

关于方法签名的问题,我没有听说过Java中的内部方法,所以你需要定义一个帮助器。例如

public void circularPrint()
{
  circularPrintAux(this);
}

对于turoise和野兔,它将是:

public void circularPrint()
{
  if( this.next == this )
      ...
  else
      circularPrintAux(this, this.next);
}

答案 1 :(得分:1)

如果它是循环链表,那意味着最后一个元素(尾部)有一个指向第一个元素的字段。所以在这一刻你也有一个头(可以这么说)。

你可以这样做:

  1. 打印尾部的next元素(这是第1个元素)。
  2. 将第二个元素分配给尾部的下一个。
  3. 重复。

答案 2 :(得分:0)

您需要传入两个参数,即当前元素和起始元素。对于您的第一次通话,这些将是相同的。打印完当前元素后,递归调用列表中的下一个元素。如果下一个元素!=起始元素,则只进行递归调用。