剑指 Offer 06. 从尾到头打印链表
思路1:二次遍历(暴力法)
第一次遍历链表得到链表长,第二次遍历链表以从数组末端开始往前加入链表。
代码:
时间复杂度O(n),空间复杂度O(1)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int[] reversePrint(ListNode head) { ListNode node = head; int cnt = 0; while(node != null) { cnt++; node = node.next; } int[] res = new int[cnt]; for (int i = cnt-1; i >= 0; i--) { res[i] = head.val; head = head.next; } return res; } }
思路2:辅助栈
利用栈后进先出的性质,遍历链表的同时将链表值入栈,遍历结束依次出栈,返回结果。
实际上利用的是 java 中 LinkedList 类的特性,可以从头部插入或删除元素,以及从尾部插入或删除元素。
同时 LinkedList 还可以返回链表元素个数,方便建立结果数组。
代码:
时间复杂度O(n),空间复杂度O(n)
class Solution { public int[] reversePrint(ListNode head) { LinkedList<Integer> stack = new LinkedList<>(); while (head != null) { stack.addFirst(head.val); head = head.next; } int[] res = new int[stack.size()]; for (int i = 0; i < res.length; i++) { res[i] = stack.removeFirst(); } return res; } }