剑指 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;
    }
}
posted @ 2021-03-02 00:25  zjcfrancis  阅读(32)  评论(0编辑  收藏  举报