给定一个链表,每 k 个节点进行一组反转,返回翻转后的链表。k 是一个正整数,值小于或等于链表的长度。如果节点总数不是 k 的整数倍,将最后剩余的节点保持原有顺序。
算法只能使用常数的额外空间,不能只单纯改变节点内部的值,需要实际进行节点交换。
分别对每 k 个部分进行链表反转,保留tail 指针指向每k次反转的尾部
- 时间复杂度 O(n),将每个节点精确处理了两次,一次是计算每个递归调用中的节点数,一次是反转子列表时,调用一次。
- 空间复杂度O(1)
- Runtime: 92 ms, faster than 90.78%
- Memory Usage: 41.7 MB, less than 85.01%
var reverseKGroup = function(head, k) {
let prev = null
let tail = null
let cur = head
while(cur !== null) {
let n = 0
while(cur !== null && n < k) {
cur = cur.next
n++
}
if(n === k) {
let t = reverseLinkedList(head, k)
if(prev === null) prev = t
if(tail !== null) tail.next = t
tail = head
head = cur
}
}
if(tail !== null) tail.next = head
return prev === null ? cur : prev
};
var reverseLinkedList = function(head, k) {
let prev = null
let cur = head
while(cur !== null && k > 0) {
let temp = cur.next
cur.next = prev
prev = cur
cur = temp
k--
}
return prev
}
网友评论