I. 问题描述
输入链表的第一个节点, 从尾到头反过来打印每个节点的值.
Linked List: [1] -> [2] -> [3] -> [4]
output: [4] -> [3] -> [2] -> [1]
节点结构如下:
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
II.思路
使用递归
的方式实现, 只要当前的ListNode 节点还有 next (也就是listNode.next != null
), 那么就进行一次递归处理.而实际上递归的方式用的是堆栈结构
III.代码实现
public class Solution {
ArrayList<Integer> arrayList=new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
this.printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);
}
return arrayList;
}
}
IV.其他思路
1. 借助堆栈后进先出实现
栈 Stack 的特性是后进先出, LIFO, 这么在循环遍历 ListNode 的时候, 将其加入栈中,当遍历到尾节点的时候,这时候栈取出的顺序就是从尾到头.
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack=new Stack<Integer>();
while(listNode!=null){
stack.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> list=new ArrayList<Integer>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
2. 借助 Java 库函数 Collections.reverse()
这种方式其实就是遍历一遍ListNode, 将每个值从头到尾保存到 list 中, 然后利用 Collections.reverse()
函数直接对 list 进行翻转即可
import java.util.ArrayList;
import java.util.Collections;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
while(listNode != null){
list.add(listNode.val);
listNode = listNode.next;
}
Collections.reverse(list);
return list;
}
}
Share this on