题目介绍
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例1
输入: head = [1,2,3,4,5], k = 2
输出: [2,1,4,3,5]
示例2
输入: head = [1,2,3,4,5], k = 3
输出: [3,2,1,4,5]
示例3
输入: head = [1,2,3,4,5], k = 1
输出: [1,2,3,4,5]
示例4
输入: head = [1], k = 1
输出: [1]
提示:
- 列表中节点的数量在范围
sz内 1 <= sz <= 50000 <= Node.val <= 10001 <= k <= szleetcode-25 K 个一组翻转链表
b站视频
解题思路
1.如果 k 的值为 1,说明不需要进行翻转,直接返回头节点即可
2.定义一个虚拟头节点,虚拟头节点的下一个节点指向头节点
3.定义 pre 指针指向虚拟头节点,定义 s 和 e 指针指向 head 节点,分别表示待反转链表开始和结束的位置
4.e 指针往前走 k - 1 步,到达链表结束的位置
5.如果 e 指向空节点,说明当前链表的节点个数不足以进行翻转,直接返回链表的头节点,结束整个过程
6.否则对 s 和 e 之间的链表进行翻转,并插入到翻转链表的上一个节点之后
7.pre 指向 s 所在的节点,s 和 e 指向 s 的下一个节点
8.重复 4-7 这个过程,直到待翻转链表的长度小于 k
解题代码
var reverseKGroup = function(head, k) {
if (k === 1) return head
const newNode = new ListNode(-1, head)
let pre = newNode, n = k, s = e = head
while (s) {
while (--n && e) {
e = e.next
}
if (!e) return newNode.next
pre.next = reverse(s, k)
pre = s
s = e = s.next
n = k
}
return newNode.next
};
var reverse = function(head, k) {
let cur = head, next = head.next
while (--k) {
head.next = next.next
next.next = cur
cur = next
next = head.next
}
return cur
}
以上就是本题的解题思路,可以查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II