剑指offer原题:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。链表节点定义如下:
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
LeetCode原题:https://leetcode.cn/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/description/
思路一:借用栈
class Solution {
public int[] reverseBookList(ListNode head) {
LinkedList<Integer> stack = new LinkedList<>();
while(head != null) {
stack.addFirst(head.val);
head = head.next;
}
int[] res = new int[stack.size()];
int top = 0;
for(int item : stack) {
res[top++] = item;
}
return res;
}
}
时间复杂度O(n)
空间复杂度O(n)
思路二:反转链表
class Solution {
public int[] reverseBookList(ListNode head) {
ListNode pre = null;
ListNode cur = head;
int n = 0;
while(cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
n++;
}
int[] res = new int[n];
int top = 0;
while(pre != null) {
res[top++] = pre.val;
pre = pre.next;
}
return res;
}
}
时间复杂度O(n)
空间复杂度O(n)