给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
每 k 个节点一组进行翻转,先计算总长度L,把链表分为L/k组,在每一组内的节点都要翻转,以1->2->3->4->5,k=3为例,cur=1
0(prev)->1(cur)->2->3->4->5
0(prev)->2->1(cur)->3->4->5
0(prev)->3->2->1(cur)->4->5
也就是每次将cur后面的节点插入它前面,prev后面
class Solution {
public:
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* prev = dummy;
ListNode* cur = head;
ListNode* next;
int len = 0;
while(head)
{
len++;
head = head->next;
}
head = cur;
for(int i = 0;i < len / k;i++)
{
for(int j = 0;j < k - 1;j++)
{
next = cur->next;
cur->next = next->next;
next->next = prev->next;
prev->next = next;
}
prev = cur;
cur = prev->next;
}
return dummy->next;
}
};