剑指 Offer 06. 从尾到头打印链表

文章提供了两种方法来实现从尾到头打印链表的功能。第一种是利用栈的后进先出(LIFO)特性,将链表节点值依次压栈,然后弹栈到数组中。第二种方法是通过递归隐式地使用栈,先遍历整个链表,然后将节点值添加到临时存储数组中。这两种方法都实现了链表的逆序打印。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从尾到头打印链表

蠢想法

在这里插入图片描述

解题思路

在这里插入图片描述
的节点顺序已经反转过来了

package swordPointingToTheOffer;
import java.util.Stack;	//引用栈

public class six {
    //初始化
    Stack<Integer> stack = new Stack<Integer>();
    //进栈
    public void push(int node){
        stack.push(node);
    }
    //出栈
    public int pop(){
        return stack.pop();
    }
//    //取栈顶值(不出栈)
//    stack.peek();
//    //判断栈是否为空
//    stack.isEmpty()
    /**
     * 链表节点
     */
    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    public int[] reversePrint(ListNode head) {
        ListNode node = head;
        Stack<Integer> st = new Stack<Integer>();
        while (node != null) {
            //压栈
            st.push(node.val);
            //链表指针后移
            node = node.next;
        }
        int i = 0;
        //弹栈到数组里面
        int[] res = new int[st.size()];
        while (i < res.length) {
            res[i++] = st.pop();
        }
        return res;
    }

    public static void main(String[] args) {
        //构建链表 (1->3->2)
        ListNode head = new ListNode(1);
        head.next = new ListNode(3);
        head.next.next = new ListNode(2);
        six sol = new six();
        //反转
        int[] res = sol.reversePrint(head);
        for (int x : res) {
            System.out.println(x);
        }
    }
}


在这里插入图片描述

将Stack中的元素pop出来存入数组int[]

递归隐式使用栈

在这里插入图片描述

package swordPointingToTheOffer;
import java.util.ArrayList;
import java.util.Stack;	//引用栈

public class six {
    /**
     * 链表节点
     */
    public static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }
    }

    //数组,用于存放弹栈的资源。。。
    ArrayList<Integer> tmp = new ArrayList<Integer>();

    public int[] reversePrint2(ListNode head) {
        recur(head);
        int[] res = new int[tmp.size()];
        for (int i = 0; i < tmp.size(); i++) {
            res[i] = tmp.get(i);
        }
        return res;
    }

    void recur(ListNode head) {
        if (head == null) {
            return;
        }
        recur(head.next);
        //弹栈到数组里面
        tmp.add(head.val);
    }

    public static void main(String[] args) {
        //构建链表 (1->3->2)
        ListNode head = new ListNode(1);
        head.next = new ListNode(3);
        head.next.next = new ListNode(2);
        six sol = new six();
        //反转
        int[] res = sol.reversePrint2(head);
        for (int x : res) {
            System.out.println(x);
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值