目 录
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入 {1,2,3} 的链表如下图:
返回一个数组为 [3,2,1]
0 <= 链表长度 <= 10000
示例1:
输入: {1,2,3}
返回值:[3,2,1]
示例2
输入:{67,0,24,58}
返回值:[58,24,0,67]
链表问题解题思路:
这道题整体解决思路很多,可以使用 stack,可以递归,也可以将数据保存数组,逆序数组
方法一:stack 方式
根据栈的特性,直接入栈出栈就能反向打印了
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if(listNode == null){
return list;
}
Stack<Integer> st = new Stack<>();
while(listNode != null){
st.push(listNode.val);
listNode = listNode.next;
}
while(!st.empty()){
list.add(st.pop());
}
return list;
}
}
方法二:逆置数组
通过顺序打印出数组,再用前后指针转换赋值打印
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
while(listNode != null){
list.add(listNode.val);
listNode = listNode.next;
}
int i = 0;
int j = list.size() - 1;
while(i < j){
Integer temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
i++;
j--;
}
return list;
}
}
方法三:递归方式
public class Solution {
public void printListFromTailToHeadCore(ArrayList<Integer> list, ListNode listNode){
if(listNode == null){
return;
}
printListFromTailToHeadCore(list, listNode.next);
list.add(listNode.val);
}
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
printListFromTailToHeadCore(list, listNode);
return list;
}
}