struct ListNode* reverseKGroup(struct ListNode* head, int k){
if (!head) return NULL;
struct ListNode *head_node = (struct ListNode *)malloc(sizeof(struct ListNode));
head_node->next = head;
int i = 0;
struct ListNode *tmp1, *tmp2, *tmp3, *tmp4 = head_node, *tmp5 = head; // tmp4先指向头结点,tmp5指向开头逆的结点
tmp1 = head_node;
tmp2 = head;
tmp3 = head->next; // 通过tmp2,tmp3进行位置的更换
while (tmp3 != NULL)
{
i++;
tmp2->next = tmp1;
tmp1 = tmp2;
tmp2 = tmp3;
tmp3 = tmp3->next;
if (i == k)
{
i = 0;
tmp4->next = tmp1;
tmp5->next = tmp2;
// printf("%d", tmp5->val);
tmp1 = tmp5;
tmp4 = tmp5;
tmp5 = tmp2;
}
}
if (i == k - 1) // 当正好的时候,倒转
{
tmp2->next = tmp1;
tmp4->next = tmp2;
tmp5->next = NULL;
}
else if (i > 0)
{
while (tmp1 != tmp4)
{
tmp2->next = tmp3;
tmp3 = tmp2;
tmp2 = tmp1;
tmp1 = tmp1->next;
}
tmp2->next = tmp3;
}
return head_node->next;
}