描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
思路1:先进后出,用栈
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> s=new Stack<>();
while(listNode!=null){
s.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> res = new ArrayList<>();
while(!s.isEmpty()){
res.add(s.pop());
}
return res;
}
主函数如上。
当链表不为空时,将数值压入栈,新建集合,栈不为空时将栈中弹出元素加入集合中
注意栈的压入(push),弹出(pop),判空(isEmpty)函数。
思路2:JAVA ArrayList里有个函数,add(index,value),可以采用类似头插法将链表中读出来的值放进集合里。
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
while(listNode!=null){
res.add(0,listNode.val);
listNode=listNode.next;
}
return res;
}
思路3:递归,递归是到达底层之后才会向上回溯
public class Solution {
public void trackBacking(ListNode head,ArrayList<Integer> res){
if(head!=null){
trackBacking(head.next,res);
res.add(head.val);
}
}
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
trackBacking(listNode,res);
return res;
}
先向链表尾部遍历,到了尾部之后再加入集合就是正确答案。
以上时间复杂度和空间复杂度都是O(n)。
应该是还有先遍历链表存储数组再反序遍历数组存进集合的办法。