Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例
示例1:
输入: head = [1,3,2]
输出: [2,3,1]
提示
限制:
0 <= 链表长度 <= 10000
难度:简单
此题为简单题,兄弟们可以重拳出击,没错,就是你想到的那种方法,简单粗暴!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 从头到尾打印链表,因为只需要逆向输出链表中结点的值,因此可以先遍历获取链表长度,并创建对应长度的数组,然后再次遍历链表并将数组逆向填充,最终输出数组就是需要的结果。
- 如果只想要遍历一次链表,可以在遍历的同时使用栈存放结点值,根据栈元素后入先出的特点,最终依次获取栈中元素到结果数组中返回。
- 还可以将链表结点值遍历存储到集合中,并使用集合内置的反转函数将集合内容反转,最后转成数组返回。
解题思路
从头到尾打印链表的三种方法中,都需要先将链表中的结点遍历存储到容器中,并在容器中进行相关操作。
三、AC 代码
链表节点结构定义
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
实现逻辑代码
- 获取链表长度并逆向存储输出
public int[] reversePrint(ListNode head) {
//先遍历获取节点长度,再遍历存到数组中
ListNode temp = head;
int count = 0;
while(temp != null){
count++;
temp = temp.next;
}
temp = head;
int[] arr = new int[count];
for(int i = 0; i < count; i++){
arr[count-1-i] = temp.val;
temp = temp.next;
}
return arr;
}
- 使用栈遍历存储节点值并输出
public int[] reversePrint(ListNode head) {
//使用栈存放元素
Stack<Integer> stack = new Stack<Integer>();
ListNode temp = head;
while(temp != null){
stack.push(temp.val);
temp = temp.next;
}
int[] arr = new int[stack.size()];
for(int i = 0; i < arr.length; i++){
arr[i] = stack.pop();
}
return arr;
}
- 使用集合存放并倒序输出
public int[] reversePrint(ListNode head) {
// 直接使用集合的reverse方法,并转成数组
ListNode temp = head;
List<Integer> list = new ArrayList<>();
while(head != null){
list.add(head.val);
head = head.next;
}
int[] res = new int[list.size()];
for(int i = list.size()-1; i >= 0; i--){
res[list.size()-1-i] = list.get(i);
}
return res;
}
四、总结
知识点
- 链表节点相关操作
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。