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;
}
}