难度:简单
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
【例】
输入: 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() | 获取链表的长度 |