这道题稍微有点难了
题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
解法一 迭代
var myReverse = function(head, tail) {
let prev = tail.next;
let p = head;
while(prev !== tail) {
const next = p.next;
p.next = prev;
prev = p;
p = next;
}
return [tail, head];
}
var reverseKGroup = function(head, k) {
let dummyNode = new ListNode(-1);
dummyNode.next = head;
let pre = dummyNode;
while(head) {
let tail = pre;
// 分成 k 组
for(let i = 0;i < k; i++) {
tail = tail.next;
if(!tail) {
return dummyNode.next;
}
}
let next = tail.next;
// head tail 反转
[head, tail] = myReverse(head,tail);
pre.next = head;
tail.next = next;
pre = tail;
head = tail.next;
}
return dummyNode.next;
};