题目:从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
1 2
| 输入:head = [3,6,4,1] 输出:[1,4,6,3]
|
链表的结构中只有指向下一个节点的指针,所以从头到尾遍历链表只能得到正序的数组,需要一些办法将顺序翻转。
解法一:使用栈
栈的结构是先入先出,很容易想到用来翻转顺序。可以将正序遍历的链表节点保存到栈里,遍历完成之后再从栈中取出,就能以倒序遍历整个链表了。
1 2 3 4 5 6 7 8 9 10 11 12 13
| public int[] reverseBookList(ListNode head) { Deque<Integer> q = new ArrayDeque<>(); while (head != null) { q.push(head.val); head = head.next; } int[] result = new int[q.size()]; int i = 0; while (!q.isEmpty()) { result[i++] = q.pop(); } return result; }
|
当然,如果只是需要节点的值,可以在栈中只保存数值,节约空间。
时间复杂度O(n) 空间复杂度O(n)
解法二:使用递归
使用递归和栈其实是一样的,但是递归使用的是方法的调用栈,在数据量很大的情况下会导致栈溢出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public int[] reverseBookList(ListNode head) { List<Integer> list = new ArrayList<>(); if (head != null) { reverseBookList(head, list); } return list.stream().mapToInt(Integer::intValue).toArray(); }
private void reverseBookList(ListNode head, List<Integer> list) { if (head != null) { reverseBookList(head.next, list); list.add(head.val); } }
|
相关代码
https://gitee.com/zhaomin6666/coding-interview/tree/main/src/main/java/com/zm/interview/chapter02/ex004