解题思路
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
}