本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
文章首发于公众号“蘑菇睡不着”
一、题目描述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
二、思路分析:
这道题的意思是反转整个链表,其实链表中元素的位置并不用动,只要将所有节点指向下一个节点的指针,指向自己的前方的节点就可以了,大家可以直接看代码,思路通过注释进行了详细的解释。
三、AC代码
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode node = head;
// 用于当作每个节点的前一个节点
ListNode prev = null;
while (node != null) {
// 先存储每个节点的下一个节点
ListNode next = node.next;
// 将指针指向前一个节点
node.next = prev;
// 将当前节点作为下一个节点的前置节点
prev = node;
// 往后移
node = next;
}
return prev;
}
}
时间复杂度:O(n),其中 n 是链表的长度,要遍历一次链表
空间复杂度:O(1)。
四、总结
这道题就是将每个节点指向下一个节点指针指向前一个节点,写的时候有一点要注意,就是每次要先存储下一个节点再去做逻辑。