6. 剑指Offer系列——面试题06. 从尾到头打印链表

133 阅读1分钟

题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

方法一:

利用栈先进后出FILO的特点,把链表压入栈中,并依次弹出

ListNode

public class ListNode{
    public int getVal() {
        return val;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public ListNode getNext() {
        return next;
    }

    public void setNext(ListNode next) {
        this.next = next;
    }

    int val;
    ListNode next;

    public ListNode(int x) {
        val = x;
    }
}

reversePrint

public int[] reversePrint(ListNode head) {
    Stack<Integer> stack = new Stack<>();
    while (Objects.nonNull(head)) {
        stack.push(head.val);
        head = head.next;
    }
    int size = stack.size();
    int[] res = new int[size];
    for (int i = 0; i < size; i++) {
        res[i] = stack.pop();
    }
    return res;
}

方法二

直接使用数组

public int[] reversePrint2(ListNode head) {
    List<Integer> list = new ArrayList<>();
    while (Objects.nonNull(head)) {
        list.add(head.val);
        head = head.next;
    }
    int size = list.size();
    int[] res = new int[size];
    int j = 0;
    for (int i = size-1; i >= 0; i--) {
        res[j++] = list.get(i);
    }
    return res;
}

Test

@Test
public void testReversePrint() {
    ListNode listNode = new ListNode(1);
    ListNode listNode1 = new ListNode(3);
    ListNode listNode2 = new ListNode(2);
    listNode1.setNext(listNode2);
    listNode.setNext(listNode1);

    Algorithm algorithm = new Algorithm();

    Long start1 = System.nanoTime();
    int[] ints = algorithm.reversePrint(listNode);
    printArray(ints);
    Long end1 = System.nanoTime();
    System.out.println("time used: " + (end1 - start1));
    System.out.println("===============================================");
    Long start2 = System.nanoTime();
    int[] ints2 = algorithm.reversePrint2(listNode);
    printArray(ints2);
    Long end2 = System.nanoTime();
    System.out.println("time used: " + (end2 - start2));

}

private void printArray(int[] ints) {
    for (int num: ints) {
        System.out.println(num);
    }
}

输出

2
3
1
time used: 135500
===============================================
2
3
1
time used: 56400