BM3 链表中的节点每k个一组翻转
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @param {number} k
* @return {ListNode}
*/
var reverseKGroup = function (head, k) {
// 链表为空直接返回null
if (!head) return null
// 用tail记录当前head的值,因为k个反转后head就为第k个元素
let tail = head
// 遍历前k个元素
for (let i = 1; i < k; i++) {
tail = tail.next
// 如果链表的长度比k小,直接返回原数组
if (!tail) return head
}
// 记录下一次翻转的头结点
let next = tail.next
// 将前k个的最后一个置空
tail.next = null
// 翻转前k个元素
reverse(head)
// 对第k个元素之后的链表进行翻转
head.next = reverseKGroup(next, k)
// 返回翻转后的链表
return tail
};
// 这个就单纯是反转链表的操作,没啥可说的
function reverse(curr) {
let pre = null
while(curr) {
const tmp = curr.next
curr.next = pre
pre = curr
curr = tmp
}
}
时间复杂度:O(n)
空间复杂度:O(1)