思路:
链表操作。
从头结点开始,每隔k个节点reverse一次,如果不足k个节点,返回。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
private:
ListNode *reverse(ListNode *prev, ListNode *begin, ListNode *end) {
ListNode *end_next = end->next;
for(ListNode *p = begin, *cur = p->next, *next = cur->next; cur != end_next; p = cur, cur = next, next = next ? next->next : nullptr) {
cur->next = p;
}
begin->next = end_next;
prev->next = end;
return begin;
}
public:
ListNode* reverseKGroup(ListNode* head, int k) {
if(head == nullptr || head->next == nullptr || k < 2) return head;
ListNode dummy(-1);
dummy.next = head;
for(ListNode *prev = &dummy, *end = head; end; end = prev->next) {
for(int i = 1; i < k && end; ++i) {
end = end->next;
}
if(end == nullptr) break;
prev = reverse(prev, prev->next, end);
}
return dummy.next;
}
};