?*&%¥#@

147 阅读1分钟

1从尾到头打印链表
题目: 输入一个链表的头节点,从尾到头反过来打印出每个节点的值, 链表的结点定义如下:

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

解题思路1:借助于栈:我们从头到尾遍历链表,可以把遍历的结果放入栈中(先进后出),每经过一个节点,把该节点放入栈中,这样输出栈就实现了从尾到头输出链表元素

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        Stack<Integer> stack = new Stack<>();
        while (listNode != null) { //一直指向最后一个节点
            stack.push(listNode.val); //进栈
            listNode = listNode.next;
        }
        ArrayList<Integer> res = new ArrayList<>();
        while (!stack.empty()) {
             res.add(stack.pop()); //出栈
        }
        return res;
    }
}

栈的基本操作:
stack.push( i );是将一个元素i值入栈
stack.empty( );是判断栈中是否为空
stack.pop( );是将栈中当前元素出栈

解题思路2:利用递归,因为栈的本质就是一个递归,所以递归也可以实现链表倒着输出,即每访问到一个结点的时候,先递归输出它后面的结点,再输出该结点自身,这样链表的结果就反过来了。

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list=new ArrayList<Integer>();
        if(listNode==null){
            return list;
        }
        if(listNode.next!=null){
            list=printListFromTailToHead(listNode.next);
        }
        list.add(listNode.val);
        return list;
    }
}