题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
规律发现
- 思路:如果允许在打印链表的时候修改链表的结构,,可以把链表中链接节点的指针反转过来
- 如果不允许修改结构有以下两种思路:
- ① 从尾到头打印,遍历的顺序是从头到尾,打印的顺序是从尾到头,典型的“先进后出”,使用栈实现
- ② 由于递归在本质上就是一个栈结构,使用递归实现,每访问到一个节点的时候,先递归输出他后面的节点,再输出该节点自身
- 注释:当链表非常长的时候,会导致递归函数调用的层次很深有可能导致函数调用栈溢出
- 因此,栈基于循环实现的代码的鲁棒性更好
完整代码展示
方法1:栈的思想
public class N3从尾到头打印链表ArrayLiat {
//首先构造一个链表
public static class ListNode{
int val;
ListNode next = null;
ListNode(int val){
this.val = val;
}
}
public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>(); //定义一个ArrayList用于存放链表元素
ArrayList<Integer> result = new ArrayList<Integer>();
while(listNode != null){
list.add(listNode.val);
listNode = listNode.next;
}
//遍历获得一个ArrayLiat链表输出
for(int i = list.size()-1; i>=0;i--)
result.add(list.get(i));
return result;
}
public static void main(String[] args) {
ListNode root = new ListNode(1);
root.val = 1;
root.next = new ListNode(2);
root.next.val = 2;
root.next.next = new ListNode(3);
root.next.next.val = 3;
root.next.next.next = new ListNode(4);
root.next.next.next.val = 4;
root.next.next.next.next = new ListNode(5);
root.next.next.next.next.val = 5;
// for(int i=4 ;i>=0;i--) {
// System.out.println(root.val);
// root=root.next;
// }
ArrayList<Integer> re = printListFromTailToHead(root);
System.out.println(re);
}
}
方法2:递归思想
ArrayList<Integer> list=new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
// ArrayList<Integer> list=new ArrayList<Integer>();
while(listNode!=null){
while(listNode.next!=null) {
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
}
return list;
}