给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
4指针

const partReverse = (fisrt, second) => {let pre = null;let cur = fisrt;// cur==second的时候还要反转一次,// 所以是pre到second才停下while (pre !== second) {const next = cur.next;cur.next = pre;pre = cur;cur = next;}return [second, fisrt];}const reverseKGroup = function (head, k) {const dummyHead = new ListNode(0);dummyHead.next = head;let pre = dummyHead;let fisrt = head;while (fisrt) {// second初始化为prelet second = pre;// 查看剩余部分长度是否大于等于 kfor (let i = 0; i < k; ++i) {second = second.next;if (!second) {return dummyHead.next;}}// 此时second来到要反转的最后一个元素// [first, second] 即为要反转的范围const next = second.next;[fisrt, second] = partReverse(fisrt, second);// 把子链表重新接回原链表// 改变指向pre.next = fisrt;second.next = next;// 更新位置pre = second;fisrt = next;}return dummyHead.next;};
