描述
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000,1≤k≤2000,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1)O(1),时间复杂度 O(n)O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k=2 , 你应该返回 2→1→4→3→5
对于 k=3 , 你应该返回 3→2→1→4→5
知识点
链表
示例
输入:
{1,2,3,4,5},2
返回值:
{2,1,4,3,5}
输入:
{},1
返回值:
{}
解题过程
方法:递归
具体做法:
- step 1:每次从进入函数的头节点优先遍历链表k次,分出一组,若是后续不足k个节点,不用反转直接返回头。
- step 2:从进入函数的头节点开始,依次反转接下来的一组链表。
- step 3:这一组经过反转后,原来的头变成了尾,后面接下一组的反转结果,下一组采用上述递归继续。
/*
* function ListNode(x){
* this.val = x;
* this.next = null;
* }
*/
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
function reverseKGroup( head , k ) {
// write code here
var tail=head;
for(var i=0;i<k;i++){
if(tail==null){ //如果不足k到了链表尾,直接返回,不翻转
return head;
}
tail=tail.next;
}
var pre=null,cur=head;
while(cur!=tail){ //在到达当前段尾节点前
var temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
head.next=reverseKGroup(tail,k); //当前尾指向下一段要翻转的链表
return pre;
}
module.exports = {
reverseKGroup : reverseKGroup
};