025. K 个一组翻转链表,2 张图,2 段代码,彻底掌握
鲁迅说,LeetCode 官方这道题的题目是 K 个一组翻转链表,怎么看怎么别扭,我觉得应该是 K 个一组,翻转链表 或者 翻转链表 K 个一组。缺少断句,不知道是不是我太敏感了(😂)。
题意
给你链表的头节点 head
,每 k
个节点一组进行翻转,请你返回修改后的链表。
k
是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k
的整数倍,那请将最后剩余的节点保持原有顺序。
注:你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
难度
困难
示例
输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]
k=2,反转的是
- 1,2 → 2,1
- 3,4 → 4,3
- 5(只有一位了,不是 k 的整数倍,保留原样)
输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]
k=3,反转的是
- 1,2,3 → 3,2,1
- 4,5(只有 2 位了,不是 k 的整数倍,保留原样)
分析
由于我们刚刚解完 024.两两交换链表中的节点 这道题,所以面对本题时,虽然是 hard 难度,但并不会被它吓到。
比如说,当 k=2 时,其实就是两两交换链表中的节点,只不过,这道题,可能是两两交换,也可能是三三交换,也可能是四四交换,也可能是五五交换……
两两交换、三三交换、四四交换……这些其实就是翻转链表:给你一个有 k 个节点的链表,翻转它。
OK,我们试着来解这道题。
public ListNode reverseList(ListNode head) {
ListNode prev = null; // 翻转链表的新头初始化为 null
ListNode curr = head; // 当前节点设置为头节点
while (curr != null) {
ListNode nextTemp = curr.next; // 保存当前节点的下一个节点
curr.next = prev; // 翻转当前节点的指向
prev = curr; // 更新 prev 为当前节点
curr = nextTemp; // 移动当前节点到下一个节点
}
return prev; // 返回翻转后的链表头
}
假设我们有一个链表:
1 -> 2 -> 3 -> 4 -> null
目标是将其翻转为:
4 -> 3 -> 2 -> 1 -> null
我们需要设置两个指针:prev
和 curr
。
prev
指针初始设置为null
,因为翻转后的链表的第一个节点(原链表的最后一个节点)将指向null
。curr
指针初始设置为head
,即链表的第一个节点。
我们开始遍历链表,对于链表中的每一个节点:
①、保存下一个节点:首先,我们需要保存 curr
节点的下一个节点,因为一旦我们改变 curr
的指向,就会失去访问它原来的下一个节点的方
回复