思路:分块转换,最后一块不转换
//多维矩阵反转
ListNode* reverseGroup(ListNode* head, int k) {
ListNode *res = new ListNode();
ListNode *resHead;
resHead = res;
int i = 1;
while(head) {
ListNode *temp = res->next;
ListNode *temp2 = head->next;
res->next = head;
head->next = temp;
head = temp2;
if (i % k == 0) {
while(res->next) {
res = res->next;
}
}
i += 1;
}
return resHead->next;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if (k <= 1 || head == NULL) {
return head;
}
ListNode *res = new ListNode();
ListNode *resHead;
resHead = res;
ListNode *kgroup = new ListNode();
ListNode *khead = kgroup;
int i = 1;
while(head) {
ListNode *temp2 = head->next;
kgroup->next = head;
head->next = NULL;
kgroup = kgroup->next;
head = temp2;
if (i % k == 0) {
ListNode *temp = reverseGroup(khead->next, k);
res->next = temp;
res = res->next;
while(res->next) {
res = res->next;
}
kgroup = new ListNode();
khead = kgroup;
}
i += 1;
}
res->next = khead->next;
return resHead->next;
}
o(n), o(1)算法
class Solution {
public:
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
ListNode* reverse(ListNode* head, ListNode* tail) {
ListNode* res;
ListNode* root = new ListNode(0);
res = root;
while (head != tail) {
ListNode* temp = head->next;
head->next = root->next;
root->next = head;
head = temp;
}
return res->next;
}
ListNode* reverseKGroup(ListNode* head, int k) {
ListNode* root;
ListNode* merge = new ListNode(0);
root = merge;
ListNode* tempHead = head;
for (int i = 0; i < k; i++) {
if (head) {
head = head->next;
} else {
return tempHead;
}
}
ListNode* newHed = reverse(tempHead, head);
tempHead->next = reverseKGroup(head, k);
//return newHed;
return newHed;
}
};