剑指offer06-从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

           可以利用栈或者递归实现逆序输出

1.链表节点类

package cn.swordOffer.util;

public class ListNode {
    public ListNode next;
    public int val;

    public ListNode(int val) {
        this.val = val;
    }
}

2.实现代码

package cn.swordOffer.num05;

import cn.swordOffer.util.ListNode;

import java.util.ArrayList;
import java.util.Stack;

/**
 * @author GONG
 * @version 1.0
 * @date 2020/11/27 16:34
 * <p>
 * 题目要求:从尾到头打印链表到每个节点的值
 * 输入一个链表头,从后往前打印每个节点
 */
public class PrintLinkList {

    public static void main(String[] args) {
        ListNode node1 = new ListNode(3);
        ListNode node2 = new ListNode(6);
        ListNode node3 = new ListNode(9);
        node1.next = node2;
        node2.next = node3;
        System.out.println("解法一:利用栈输出,反转后:" + PrintLinkList.printListReverse1(node1));
        System.out.println("解法二:递归,反转后:" + PrintLinkList.printListReverse2(node1));
    }

    /**
     * 解法一:利用栈输出
     */
    private static ArrayList<Integer> printListReverse1(ListNode node1) {
        // 判空
        if (node1 == null) return null;
        // 创建一个list集合,用来存储最后的结果
        ArrayList<Integer> final_list = new ArrayList<>();
        // 创建一个栈,用来存放节点
        Stack<ListNode> stack = new Stack<>();

        // 将节点按照顺序放在栈中
        ListNode headNode = node1;
        while (headNode != null) {
            stack.push(headNode);//添加节点
            headNode = headNode.next;
        }
        // 通过栈的先进后出的特点,逆序将数据放到list集合中
        while (!stack.empty()) {
            ListNode node = stack.pop();
            final_list.add(node.val);
        }
        return final_list;
    }

    /**
     * 解法二:递归(其实底层还是栈)
     */
    private static ArrayList<Integer> printListReverse2(ListNode node1) {
        // 判空
        if (node1 == null) return null;
        // 创建一个list集合,用来存放数据
        ArrayList<Integer> final_list = new ArrayList<>();
        ListNode headNode = node1;
        if (headNode.next != null) {
            final_list = printListReverse2(headNode.next);
        }
        final_list.add(headNode.val);
        return final_list;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值