题目例子图片比较多,贴题目链接:
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
思路:每 k 个一组将链表划分开,然后进行翻转链表,翻转完成后,再用上一次翻转的尾结点连接上。
第一次翻转时由于没有上一次翻转的尾结点,所以用一个虚拟结点来连接。
在最后,余留的部分,就直接不翻转进行连接即可。
class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { if(k == 1) return head; // k == 1 直接特判 ListNode *virtualHead = new ListNode; // 虚拟结点 ListNode *retHead = virtualHead; ListNode *first; int cnt = 0; while(head) { ++ cnt; if(cnt % k == 1) first = head; // 翻转要用 ListNode *nxt = head -> next; if(cnt % k == 0) { head -> next = nullptr; // 把 k 个一组的链表分开 auto ret = reverseList(first); virtualHead -> next = ret.second; // 上一次翻转的尾结点 连接上这一次翻转完成后的头结点 virtualHead = ret.first; // 更新 } head = nxt; } if(cnt % k != 0) { // 余留的不足 k 个结点的, 直接用上次翻转的尾结点连接上这次的头结点 virtualHead -> next = first; } ListNode *ret = retHead -> next; delete retHead; return ret; } private: pair<ListNode *, ListNode *> reverseList(ListNode *head) { // first, second: 翻转后的链表尾 和 链表头 ListNode *pre = nullptr; ListNode *first = head; while(head) { auto nxt = head -> next; head -> next = pre; pre = head; head = nxt; } return {first, pre}; } };