给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 进阶: 你可以设计一个只使用常数额外空间的算法来解决此问题吗? 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5] 示例 2: 输入:head = [1,2,3,4,5], k = 3 输出:[3,2,1,4,5] 示例 3: 输入:head = [1,2,3,4,5], k = 1 输出:[1,2,3,4,5] 示例 4: 输入:head = [1], k = 1 输出:[1] /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: //反转链表,递归算法 ListNode* reverseN(ListNode* head, int k) { if(k==1)return head; ListNode *tail = head->next,*q = reverseN(head->next,--k); head->next = tail->next; tail->next = head; return q; } //判断p的后k个元素是否为空,空则不反转,不空则反转 ListNode* reverseK(ListNode* head, int k) { ListNode *q = head; int cnt = k; while(--cnt && q){ q = q->next; } if(q == nullptr){return head;} return reverseN(head,k); } //递归k个一组的循环,执行上述的操作 ListNode* reverseKGroup(ListNode* head, int k) { ListNode ret(-1,head),*q = head,*p = &ret; while(q!=nullptr && q !=(p->next = reverseK(q,k))){ p = q; q = q->next; } return ret.next; } };