我正在从我的教科书中随机练习问题而且我遇到了这个问题并且无法完成。
如何以相反的顺序打印圆形单链表?例如:如果列表包含元素:1 2 3,则应打印它们3 2 1
请注意,它是一个循环链表,方法中不应包含任何参数。
谢谢!
答案 0 :(得分:3)
在基本情况下(起始节点等于下一个节点),打印当前节点。否则,递归到下一个节点,然后打印当前节点。
请注意,由于堆栈,它使用线性空间,但这是最佳的,因为您没有后向指针。
答案 1 :(得分:2)
这是使用递归的可能解决方案,打印方法不接收任何参数:
public class ReversePrinter {
private Node<?> head;
private Node<?> current;
private boolean first = true;
public ReversePrinter(Node<?> head) {
this.head = head;
this.current = head;
}
public void printReverse() {
if (current == null) {
return;
} else if (current == head) {
if (!first) return;
first = false;
}
Node<?> previous = current;
current = current.getNext();
printReverse();
System.out.println(previous.getInfo());
}
}
像这样使用:
ReversePrinter printer = new ReversePrinter(nodeHeadOfList);
printer.printReverse();
对于问题中的示例,它将在控制台上打印:
3
2
1
答案 2 :(得分:1)
怎么样:
class Node {
int data;
Node next;
public Node getNode() ...
public String toString() ...
}
public class CircularList {
private Node list;
public void printReverse() {
final Node head = this.list;
printReverseRecurse(list, head);
System.out.println(list.toString());
}
private void printReverseRecurse(Node node, Node head) {
if (node != head) {
printReverseRecurse(node.getNext(), head);
System.out.print(node.toString());
}
}
}
编辑后,我忘记将head
引用传递给私有方法。
答案 3 :(得分:1)
这是一种在堆上使用堆栈而不是程序堆栈的非递归方法。应该使用比递归方法更少的内存。
class Node {
private int data;
private Node next;
public Node getNode() { ... }
public String toString() { ... }
}
public class CircularList {
private Node list;
public reversePrint() {
Stack<Node> stack = new Stack<Node>();
// First, put all the entries in the stack
Node node = list;
do {
stack.push(node);
node = node.getNext();
} while (node != list);
while (!stack.empty()) {
System.out.print(stack.pop());
}
}
}