题目描述
将给出的链表中的节点每k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 O(1)
例如:
给定的链表是1→2→3→4→5
对于k=2, 你应该返回2→1→4→3→5
对于k=3, 你应该返回3→2→1→4→5
示例1
输入
{1,2,3,4,5},2
返回值
{2,1,4,3,5}
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode *reverseKGroup(ListNode* head, int k) {
// write code here
if(head==nullptr||head->next==nullptr) return head;
ListNode *tail=head;
for(int i=0;i<k;i++)
{
if(tail==nullptr)
return head;
tail=tail->next;
}
ListNode *new_head=reverse(head,tail);
head->next=reverseKGroup(tail,k);
return new_head;
}
ListNode* reverse(ListNode *head,ListNode *tail)
{
ListNode *newhead=nullptr,*temp=nullptr;
while(head!=tail)//反转到tail前一个结点,tail本身未参与反转
{
temp=head->next;
head->next=newhead;
newhead=head;
head=temp;
}
return newhead;
}
};