题目描述:输入一个链表,从尾到头打印链表每个节点的值。
思路:1.首先想到采用递归的思路 从后往前打印
public class Solution {
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
ArrayList<Integer> list = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if (listNode != null) {
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
简洁,但是开销会比较大,函数调用层次太深,会造成栈溢出
2思路:采用栈先进后出的性质,用栈保存链表结点,然后出栈
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if(listNode == null){
return list;//注意不是返回null,而是返回[]
}
Stack<ListNode> stack = new Stack<>();
ListNode current = listNode;
while(current!= null){
stack.push(current);//遍历入栈
current = current.next;
}
while(!stack.empty()){//出栈
list.add(stack.pop().val);
}
return list;
}
}
3思路:直接遍历链表保存,然后利用Collections.reverse()进行翻转
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<>();
if (listNode == null) {
return list;
}
ListNode current = listNode;
while (current != null) {
list.add(current.val);
current = current.next;
}
Collections.reverse(list);
return list;
}
}
4思路:先对链表进行反转,然后进行遍历即可。