# 25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
# 解题思路
遍历链表,并记录当前节点的序号,如果当前节点的序号是 k 的整数倍,那么就翻转从上一组尾部到当前节点的链表。
为此每一次反转我们都需要更新上一组的尾部和下一组的开头节点。
最后,如果剩余的节点个数不是 k 的整数倍,那么需要将剩余部分直接添加到上一组的尾部。
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var reverseKGroup = function (head, k) {
function reverseList(head) {
var cur = head,
temp = null,
prev = null
while (cur) {
temp = cur.next
cur.next = prev
prev = cur
cur = temp
}
return prev
}
if (k === 1 || !head.next) {
return head
}
var n = 0 // 节点数
var n_head = new ListNode()
var prev = n_head // 上一部分的终点
var cur_start = head // 当前部分的起点
var cur = head
var next = null // 接下来一部分的起点
while (cur) {
n++
// k 的整数倍
if (!(n % k)) {
// 反转当前部分的起点到当前点,并将当前点的下一个点更新到接下来一部分的起点
next = cur.next
cur.next = null
prev.next = reverseList(cur_start)
prev = cur_start
cur = next
cur_start = cur
} else {
cur = cur.next
}
}
if (n % k) {
prev.next = cur_start
}
return n_head.next
}