k个一组翻转链表
给你一个链表每k个节点一组进行翻转,返回翻转后的链表
代码实现
var reverseKGroup = function(head, k) {
if (!head) return null;
let ret = new ListNode(-1,head); // 创建一个虚头
let pre = ret; // p节点指向虚头 这样翻转之后,p 等于待翻转区域的前一个节点
do {
pre.next = reverse(pre.next, k); // p.next 代表翻转以后链表的尾节点
for (let i = 0; i < k && pre; i++) {
pre = pre.next; // 往后走k步
}
if (!pre) break; // 如果pre为空了 代表已经走到整个链表的尾部,直接停止循环
} while (1);
return ret.next; // 返回翻转的链表
};
var reverse = function(head,n){ // 翻转链表,从传入的头结点到第n个节点翻转
let pre = head;
let cur = head;
let con = n;
while (--n && pre) pre = pre.next; // 判断是否够n个节点
if (!pre) return head; // 如果pre不存在说明不够n个节点,直接返回
pre = null; // 置空
while (con--) [cur.next, pre, cur] = [pre, cur, cur.next] ; // 翻转链表
head.next = cur;
return pre; // 返回翻转后的链表
}