先来看题目:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例:
输入:head = [1,3,2]
输出:[2,3,1]
思考:
这个题比较简单,要注意的就是如果按照正常的解题思路(这种做法总是需要两边循环的),我们首先需要拿到是链表的节点个数,然后创建一个数组,对数组的元素进行赋值。
以下是解题步骤:
1. 为了提高效率,这里不需要单独判断 head == null 的情况。首先定义一个 len = 0 。
2. 使用一个备份的 head ,用来遍历链表,将节点的个数用 len 统计出来。
3. 重置一下 cur 的指向,创建一个 len 个元素的 int[ ],准备用来存放数据。
4. 使用循环,从数组的最后一个元素下标开始赋值。最后返回 int [ ]。
具体代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] reversePrint(ListNode head) {
//用来统计节点个数
int len = 0;
//使用备份的cur来遍历链表
ListNode cur = head;
while(cur != null){
len++;
cur = cur.next;
}
//重置一下cur,方便后续使用
cur = head;
//创建一个int[],准备存放节点的值
int[] data = new int[len];
//将链表节点的值从数组最后一个元素开始依次向前存放
for(int i = len-1; i >= 0; i--){
data[i] = cur.val;
cur = cur.next;
}
//返回数组,如果head为null,上面两次循环都进不去
//这时走到22行时创建的就是一个空数组
return data;
}
}
LeetCode上的测试结果:
测试通过!