题目:输入一个链表的头节点,从头到尾反过来打印出每一个节点的值。链表定义如下:
struct ListNode{
int m_mkey;
ListNdoe* m_pNex;
}
其实和这个一样,我们简单更改一下成为java语言;
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
话不多说,直接撸代码:
方法一:使用栈的方式:
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
Stack<Integer> stack = new Stack<>();
while(listNode.next!=null) {
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.empty()) {
list.add(stack.pop());
}
return list;
}
思路:由于要求我们返乡输出节点的值,我们可以利用栈的思想来实现。将每一个节点的值存储在栈中,当我们需要的时候再将它们挨个pop出来;
方法二:使用递归的思想:
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
递归的缺陷:如果我们的链表很长,就会导致函数调用的层级很深,有可能导致函数调用栈溢出。