剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
有以下两种方法
-
翻转链表,然后遍历链表加入到数组当中。
//迭代的方式把链表翻转 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int[] reversePrint(ListNode head) { if(head==null) { int[] array = new int[0]; return array; }else if(head.next==null) { int[] array = {head.val}; return array; }else{ ListNode pre = null; int count = 0 ;//计数 while(head!=null) { ListNode next = head.next; //记录head->next head.next = pre; pre = head; head = next; count ++; } //此时head==null,pre为翻转链表头节点 int[] array = new int[] for(int i =0 ;i<count;i++) { array[i] = pre.val; pre = pre.next; } return array; } } }
复杂度优秀
T(n) = O(n)
S(n) = O(n)
-
利用一个stack栈来正向遍历存储链表,最后逐个出栈加入到数组当中。
class Solution { public int[] reversePrint(ListNode head) { //辅助栈方法 if(head==null) { int[] array = new int[0]; return array; } LinkedList<Integer> stack = new LinkedList<Integer>(); while(head!=null) { stack.addLast(head.val); head = head.next; } int[] array = new int[stack.size()]; int i = 0 ; while(!stack.isEmpty()) { array[i++] = stack.removeLast(); } return array ; } }
复杂度一般
T(n) = O(n)
S(n) = O(n)