【剑指offer第2版-第7题-JAVA】

文章介绍了两种从尾到头反向打印链表的方法:一种是递归实现,虽然简洁但可能因深度过大导致栈溢出;另一种是利用Java的Stack,先正向遍历链表将节点值压栈,再反向打印栈内元素。这两种方法各有优劣,适用于不同场景。
摘要由CSDN通过智能技术生成

题目:从尾到头反向打印链表

题目:输入一个链表的头节点,从尾到头反过来打印每个节点的值。链表的定义结构如下:
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());
        }
}

总结:

逻辑代码实现的方式有很多种,面试不要紧张,一定要尽力表达出自己最优秀的一面

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值