牛客链接:https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e?tpId=196&&tqId=37080&rp=1&ru=/ta/job-code-total&qru=/ta/job-code-total/question-ranking
本人题解:
有点绕,好好理解
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
// 解法,把当前子链表的头节点(反转后为尾节点),指向下一反转后的子链表的头节点
// 比如第一次翻转后 3->2->1->null head是1->null,我们要把1指向下一翻转后子链表的头结点
function reverseKGroup( head , k ) {
// write code here
let tail = head;
// 找到尾部用来作为下一子链表的头部
for(let i=0;i<k;i++){
// 不足k个则原样返回
if(tail===null) return head;
tail = tail.next;
}
let pre = null;
let cur = head;
// 反转子链表
for(let i=0;i<k;i++){
const temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
// 利用递归不断反转链接链表,将反转后子链表的尾节点链接到下一翻转链表的头结点
// 此处递归过程会开辟一个新的空间和变量
head.next = reverseKGroup(tail,k);
// 返回第一次反转子链表的头结点(整个链表的头结点)
return pre;
}
module.exports = {
reverseKGroup : reverseKGroup
};