【算法系列】剑指 Offer 06 从尾到头打印链表

74 阅读1分钟

剑指 Offer 06 从尾到头打印链表

1 题目

  • 输入一个链表的头节点,从尾到头反过来打印出每个节点的值。

2 提示

  • 链表中节点的数目范围是 [0, 10000]。

3 示例

// 示例 1
输入: [1,2,3,4,5]
输出: [5,4,3,2,1]

// 示例 2
输入: [1,2]
输出: [2,1]

// 示例 3
输入: []
输出: []

4 解题思路

  • 反转链表(改变链表)。

5 复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

6 题解

/**
 * public class ListNode {
 *   int val;
 *   ListNode next;
 *   ListNode() {}
 *   ListNode(int val) { this.val = val; }
 *   ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
public class JZ06_从尾到头打印链表 {

    public static void main(String[] args) {
        // 测试用例
        ListNode head = ListNode.createListNode(new int[]{1, 2, 3, 4, 5});
        PrintUtils.getInstance().printListNode(solution(head));
    }

    /**
     * 时间复杂度:O(n)
     * 空间复杂度:O(1)
     */
    private static ListNode solution(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode pre = null, curr = head, next = null;
        while (curr != null) {
            next = curr.next;
            curr.next = pre;
            pre = curr;
            curr = next;
        }
        return pre;
    }
}