题目
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
解题思路
遍历链表,取开始和结束长度为k个的节点进行反转,注意判断临界条件,如果end节点为空,直接返回结果
var reverseKGroup = function(head, k) {
if(head === null || head.next === null) return head;
const virtualNode = new ListNode(0);
virtualNode.next = head;
// 设定pre节点和end节点,由此来反转k个节点
let pre = virtualNode, end = virtualNode;
// end的next节点为空则终止循环
while(end.next) {
// 找到一段循环中的end节点
for (let i = 0; i < k && end !== null; i++) {
end = end.next;
}
// 如果end为空, 说明链表走到了最后,跳出循环
if (end === null) {
break;
}
// 截取需要反转的链表
let start = pre.next;
let curr = end.next;
end.next = null;
// 反转start开始的链表,并将反转后的链表的头节点与pre相连
pre.next = reverse(start);
start.next = curr;
pre = start;
end = pre;
}
return virtualNode.next;
};
function reverse(head) {
let pre = null, curr = head;
while(curr) {
const next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}