输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
限制:
题解一:
/**
* 剑指 Offer 06. 从尾到头打印链表
*
* @param head 链表头节点
* @return 链表数据逆序数组
*/
public int[] reversePrint(ListNode head) {
// 顺序遍历链表并将值放入栈中,当遍历完链表后依次将栈中元素弹出放进数组并返回
Stack<Integer> dataStack = new Stack<>();
ListNode cur = head;
while (cur != null) {
dataStack.push(cur.val);
cur = cur.next;
}
int size = dataStack.size();
int[] res = new int[size];
for (int i = 0; i < size; i++) {
res[i] = dataStack.pop();
}
return res;
}
题解二:
private final List<Integer> integerList = new ArrayList<>();
/**
* 3. 剑指 Offer 06. 从尾到头打印链表
*
* @param head 链表头节点
* @return 逆序链表值数组
*/
public int[] reversePrint(ListNode head) {
/*
* 递归:利用递归逐层返回的特点,使用辅助方法一直遍历到链表尾,
* 逐个返回逆序的节点,将节点的值添加到集合中,最后遍历集合元素得到结果数组
*/
recursion(head);
int size = integerList.size();
int[] res = new int[size];
for (int i = 0; i < size; i++) {
res[i] = integerList.get(i);
}
return res;
}
/**
* 递归遍历链表
*
* @param cur 当前节点
*/
void recursion(ListNode cur) {
if (cur == null) {
return;
}
recursion(cur.next);
integerList.add(cur.val);
}