Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例
示例1:
输入: head = [1,3,2]
输出: [2,3,1]
提示
限制:
0 <= 链表长度 <= 10000
难度:简单
此题为简单题,兄弟们可以重拳出击,没错,就是你想到的那种方法,简单粗暴!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 题目需要实现链表的反转,最简单直接的方法就是在迭代遍历链表的同时,将链表的节点指向进行反转,并返回最后一个非空结点。
- 需要注意的是,在遍历节点的同时反转链表,则需要记录当前结点、当前结点的前驱结点和后置结点,后置结点可以通过 next 指针获取,而前驱结点则需要使用变量存储。
解题思路
链表反转的主要实现流程为:
- 初始化结点变量,当前结点变量 cur=head; 前驱和后置结点变量 pro=next=null;
- 使用循环对于链表种所有结点执行反转操作,pro 初始化为 null 保证所有结点统一操作
- 从当前 head 结点开始,先记录当前结点的后置结点 next=cur.next;
- 然后将当前结点指向前驱结点 cur.next=pro;
- 当前结点操作完之后,当前结点成为前驱结点 pro=cur;
- 后置结点成为下一个当前结点 cur=next;
- 当前结点为 null 时循环结束,此时当前结点的前驱结点 pro 作为初始链表最后一个结点,也是新链表的第一个结点,返回即可。
三、AC 代码
链表节点结构定义
// Definition for singly-linked list.
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x;
}
实现逻辑代码
- 两个临时变量依次反转链表
public ListNode reverseList(ListNode head) {
// 定义变量存放前驱、当前、后置结点
ListNode pro, cur, next;
pro = null;
cur = head;
while(cur != null){
next = cur.next;
// 更改当前结点指向
cur.next = pro;
pro = cur;
cur = next;
}
return pro;
}
四、总结
知识点
- 链表关键词:前驱结点、后置结点
- 链表节点操作:链表结点向前移动、链表指针反转
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。