题目地址: 链接
思路:
从头节点开始,判读之后的节点长度是否超过k
- 若超过,则反转之后的 k 节点,使用头插法进行翻转
- 没有超过,结束循环。
最后返回头节点即可。
js
/**
* 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) {
const dummy = new ListNode(0, head);
let [p, q] = [dummy, dummy];
while(p) {
let l = k;
while(l -- && p) {
p = p.next;
}
if(p) p = kRev(q, k);
q = p;
}
return dummy.next;
};
/**
* 反转从 dummy 后 k 个节点
*/
var kRev = function(dummy, k) {
let head = dummy.next;
dummy.next = null;
let p = head;
for(let i = 0; i < k; i ++) {
let q = p;
p = p.next;
q.next = dummy.next;
dummy.next = q;
}
let np = dummy;
while(np.next) np = np.next;
np.next = p;
return np;
}