题目:从尾到头反向打印链表
题目:输入一个链表的头节点,从尾到头反过来打印每个节点的值。链表的定义结构如下:
public class LinkedNode {
//题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值
private int value;
private LinkedNode nextNode;
public LinkedNode(int value) {
this.value = value;
}
public int getValue() {
return value;
}
public LinkedNode getNextNode() {
return nextNode;
}
public LinkedNode(int value, LinkedNode nextNode) {
this.value = value;
this.nextNode = nextNode;
}
}
结构示意简图
head -> A -> B -> C -> D
题目给出的链表结构相对简单,如有需要可自行添加相关构造函数以及其他函数。本题仅需要打印故未实现其他函数。由链表的数据结构特性很容易想到递归实现,上代码。
//递归实现
public static void printReverse(LinkedNode node){
//当前节点部位空
if(node!=null){
//如果下一个节点不为空,则递归调用打印下一个节点
if(node.getNextNode()!=null){
printReverse(node.getNextNode());
}
//打印当前节点
System.out.println(node.getValue());
}
}
递归调用代码简介易懂,缺点是当链表非常长时,会导致函数的调用层级过深,从而导致栈内存溢出。具体使用看面试官要求,另外一种快捷简便的方式就是使用Java的Stack栈,栈的特点是后进先出,形象的说子弹栈,具体思路是先正向遍历链表,将链表中的值压入栈中,最后遍历栈打印数据,废话不多说,上代码。
public static void printReverseStack(LinkedNode node){
//使用java.util.Stack
Stack<Integer> stack = new Stack<>();
//当节点不为空,循环遍历
while(node !=null){
//将当前node节点值压入栈中
stack.push(node.getValue());
//将node节点的下一个节点赋值给node;
node = node.getNextNode();
}
//当栈不为空时
while(!stack.empty()){
//移除栈顶元素并打印
System.out.println(stack.pop());
}
}
总结:
逻辑代码实现的方式有很多种,面试不要紧张,一定要尽力表达出自己最优秀的一面