Java 从尾到头打印链表详解

从尾到头打印链表

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个 ArrayList

解法

解法一【推荐】

遍历链表,每个链表结点值 push 进栈,最后将栈中元素依次 poplist 中。

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.Stack;

/**
 * @author bingo
 * @since 2018/10/28
 */
public class Solution {
    /**
     * 从尾到头打印链表
     * @param listNode 链表头节点
     * @return list
     */
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> res = new ArrayList<>();
        if (listNode == null) {
            return res;
        }
        Stack<Integer> stack = new Stack<>();
        while (listNode != null) {
            stack.push(listNode.val);
            listNode = listNode.next;
        }
        while (!stack.isEmpty()) {
            res.add(stack.pop());
        }

        return res;
    }
}

解法二【不推荐】

利用递归方式:

这种方式不推荐,当递归层数过多时,容易发生 Stack Overflow

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.ArrayList;
import java.util.Stack;

/**
 * @author bingo
 * @since 2018/10/28
 */
public class Solution {
    /**
     * 从尾到头打印链表
     * @param listNode 链表头结点
     * @return list
     */
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> res = new ArrayList<>();
        if (listNode == null) {
            return res;
        }

        addElement(listNode, res);
        return res;

    }

    private void addElement(ListNode listNode, ArrayList<Integer> res) {
        if (listNode.next != null) {
            // 递归调用
            addElement(listNode.next, res);
        }
        res.add(listNode.val);
    }
}

测试用例

  1. 功能测试(输入的链表有多个结点;输入的链表只有一个结点);
  2. 特殊输入测试(输入的链表结点指针为空)。

教程来源于Github,感谢apachecn大佬的无私奉献,致敬!

技术教程推荐

数据结构与算法之美 -〔王争〕

高并发系统设计40问 -〔唐扬〕

图解 Google V8 -〔李兵〕

视觉笔记入门课 -〔高伟〕

Python自动化办公实战课 -〔尹会生〕

基于人因的用户体验设计课 -〔刘石〕

JavaScript进阶实战课 -〔石川〕

大型Android系统重构实战 -〔黄俊彬〕

程序员职业规划手册 -〔雪梅〕