题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
题解:
方法一:栈
这里最容易想到的一种方式就是把链表的节点全部压栈,因为栈是先进后出的一种数据结构,全部压栈之后再一个个出栈即可,
压栈完之后再一个个出栈
public int[] reversePrint(ListNode head) {
Stack<ListNode> stack = new Stack<>();
ListNode temp = head;
while (temp != null) {
stack.push(temp);
temp = temp.next;
}
int size = stack.size();
int[] res = new int[size];
for (int i = 0; i < size; i++) {
res[i] = stack.pop().val;
}
return res;
}
这种方法效率不是很高
方法二:递归
public int[] reversePrint(ListNode head) {
int cout = length(head);
int[] res = new int[cout];
reversePrintHelper(head, res, cout - 1);
return res;
}
//计算链表的长度
public int length(ListNode head) {
int cout = 0;
ListNode dummy = head;
while (dummy != null) {
cout++;
dummy = dummy.next;
}
return cout;
}
public void reversePrintHelper(ListNode head, int[] res, int index) {
if (head == null)
return;
reversePrintHelper(head.next, res, index - 1);
res[index] = head.val;
}
此方法用时时间短,但内存开销大
作者:sdwwld
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/solution/3chong-jie-jue-fang-shi-zhan-di-gui-fan-zhuan-di-e/
来源:力扣(LeetCode)