将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
数据范围: 0≤n≤2000 , 1≤k≤2000 ,链表中每个元素都满足 0≤val≤1000
要求空间复杂度 O(1),时间复杂度 O(n)
例如:
给定的链表是 1→2→3→4→5
对于 k=2 , 你应该返回 2→1→4→3→5
对于 k=3 , 你应该返回 3→2→1→4→5
方法一(递归法):
//定义数据结构体
struct ListNode{
int val;
struct ListNode* next;
};
class Solution{
public:
//利用递归方法求得每组的翻转
ListNode* reverseKGroup(ListNode* head,int k){
//定义一个尾结点,来确定翻转位置
ListNode* tail=head;
//判断尾部是否还有K个,没有返回头节点
for(int i=0;i<k;i++){
if(tail==NULL)
return head;
tail=tail->next;
}
//定义前驱节点和当前节点
ListNode* pre=NULL;
LIstNode* cur=head;
//当前节点到达尾结点
while(cur!=tail){
//翻转
ListNode* temp=cur->next;
cur->next=pre;
pre=cur;
cur=temp;
}
//进行下一组翻转
head->next=reverseKGroup(tail,k);
return pre;
}
};
其他方法待更中