刷题笔记 剑指 Offer 06. 从尾到头打印链表

难度:简单


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

【例】

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

【解法1】反转链表或反转数组

从尾到头打印链表,最容易想到的就是,先反转链表,再遍历链表头到链表尾,并在遍历过程中将值存入数组;或者先遍历链表,在遍历过程中将链表的值存入数组,再对数组做反转,这里使用反转链表的方式处理

class Solution {
    public int[] reversePrint(ListNode head) {
        if (head == null) return new int[0];
        if (head.next == null) return new int[]{head.val};
        ListNode tail = null;
        // 头插法反转链表
        int size = 0, index = 0;
        while (head != null) {
            ListNode curr = head;
            head = head.next;
            curr.next = tail;
            tail = curr;
            size++;
        }
        int[] res = new int[size];
        while (tail != null) {
            res[index++] = tail.val;
            tail = tail.next;
        }
        return res;
    }
}

使用头插法反转链表

【解法2】栈

倒着输出,可以考虑先入后出的栈结构,这里采用双向队列的API模拟栈结构

class Solution {
    public int[] reversePrint(ListNode head) {
        if (head == null) return new int[0];
        if (head.next == null) return new int[]{head.val};
        LinkedList<Integer> stack = new LinkedList<>();
        while (head != null) {
            stack.push(head.val);
            head = head.next;
        }
        int size = 0;
        int[] res = new int[stack.size()];
        while (stack.size() != 0) {
            res[size++] = stack.pop();
        }
        return res;
    }
}

知识点复盘

反转链表

反转链表是链表的基本操作之一,对它必须非常熟悉。反转链表可以通过头插法、迭代等方式实现

【头插法反转链表】

LinkedList当做双向链表使用

public boolean offer(E e)队列的入队操作
public E poll()队列的出队操作
public boolean push(E e)栈的入栈操作
public E pop()栈的出栈操作
public int size()获取链表的长度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值