题目:给定一个链表,每k个节点一组进行翻转,请你返回反转后的链表,如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序
例:
输入:
1-2->3->4->5
当k=3时,应当返回
3->2->1->4->5
题解(一):方法与leetcode24基本类似,只是将两个一组换成了多个一组,将每组的个数改为了变量,但解题思路是基本一致的
class Solution {
public:
void insert(ListNode* rest, ListNode* head,int k)
{
//反转链表组,pair用于控制链节反转的次数
int pair = 0;
while (rest != NULL && pair < k)
{
ListNode* temp = rest;
rest = rest->next;
temp->next = head->next;
head->next = temp;
pair++;
}
ListNode* newHead = head;
/*
*若剩余的链表长度不足以构成链节组,
*则将已反转的链节再次反转,这样就满足题目剩余链节保持原序的要求
*/
if (pair < k)
{
head->next = rest;
head->next = NULL;
while (rest != NULL )
{
ListNode* temp = rest;
rest = rest->next;
temp->next = head->next;
head->next = temp;
}
}
else
{
for (int k = 0;k < pair;k++)
newHead = newHead->next;
}
//进行递归调用,一次反转一个链节组
if (rest != NULL)
insert(rest, newHead,k);
}
//返回进行成对反转后的链表
ListNode* swapPairs(ListNode* head,int k)
{
ListNode* resHead = new ListNode;
insert(head, resHead,k);
return resHead->next;
}
};