给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。
k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function reverseKGroup(head: ListNode | null, k: number): ListNode | null {
//第一步,找出从哪里到哪里需要进行翻转,记录下来
//第二遍,利用上一个反转链表 2 的思路,将每一个从a 到 b 的链表进行反转
const dommy = new ListNode(0,head)
let curr = head
let length = 0
while(curr){
length ++
curr = curr.next
}
let divisor = Math.floor(length / k)
curr = head
let pre = dommy
while(divisor){
//循环执行 divisor 次
for(let i = 0;i<k-1;i++){
let next= curr.next
curr.next = next.next
next.next =pre.next
pre.next = next
}
for(let i=0;i<k;i++){
//移动 k 次 pre,移动一次 cur
pre = pre.next
}
curr = curr.next
divisor--
}
return dommy.next
};