从尾到头打印链表

https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

思路

1.熟悉链表ListNode


从尾到头打印链表_第1张图片
分析.jpg

2.反转ArrayList可用Collections.reverse(list);
3.在此回忆一下数组与链表的区别:

  • 数组静态分配内存,链表动态分配内存;
  • 数组在内存中连续,链表不连续;
  • 数组内存在栈区,链表内存在堆区;
  • 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n);
  • 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。
  • 数组适合查找,链表适合插入、删除;

代码

public class Solution {
    public static class ListNode {
        int val;
        ListNode next = null;

        ListNode(int val) {
            this.val = val;
        }
    }

    public static void main(String[] args) {
        int[] input = new int[]{67, 0, 24, 58};
        ListNode listNode = buildListNode(input);
        ArrayList list = printListFromTailToHead(listNode);
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    public static ListNode buildListNode(int[] input) {
        ListNode head = new ListNode(-1);
        ListNode p = head;
        for (int i = 0; i < input.length; i++) {
            ListNode n = new ListNode(input[i]);
            p.next = n;
            p = p.next;
        }
        return head.next;
    }

    public static ArrayList printListFromTailToHead(ListNode listNode) {
        ArrayList list = new ArrayList();
        ListNode n = listNode;
        while (n != null) {
            list.add(n.val);
            n = n.next;
        }
        Collections.reverse(list);
        return list;
    }
}

你可能感兴趣的:(从尾到头打印链表)