一、思路:
先實現兩個節點翻轉,再實現k個節點翻轉,最後實現一組一組翻轉
二、C++代碼:
class Solution {
public:
ListNode* swap(ListNode *f1, ListNode *f2, int count) {
ListNode *nowNode = f2;
ListNode *f3, *l1, *l2 = NULL, *l3;
while (--count > 0) {
if (nowNode->next == NULL) //表明鏈表不足k位
return NULL;
else if (count == 1) {
l2 = nowNode->next;
l1 = nowNode;
l3 = l2->next;
f3 = f2->next;
f2->next = l3;
if (l1 == f2)
l2->next = f2;
else {
l1->next = f2;
l2->next = f3;
}
if (f1 != NULL)
f1->next = l2;
return l2;
}
nowNode = nowNode->next;
}
return l2;
}
ListNode *swapKNodes(ListNode *f1, ListNode *f2, int k) {
ListNode *nowNode = NULL;
ListNode *parent = f2;
for (int i = k; i > 1; i -= 2) {
if (i == k) {
f2 = swap(f1, f2, i);
nowNode = f2;
}
else {
nowNode->next = swap(nowNode, nowNode->next, i);
nowNode = nowNode->next;
}
}
return f2;
}
ListNode* reverseKGroup(ListNode* head, int k) {
if (k <= 1)
return head;
ListNode *nowNode = head, *f1 = NULL, *f2 = head, *l2 = NULL;
int count = 0;
while (nowNode != NULL) {
if (count%k == k - 1) {
nowNode = f2;
if (count == k - 1) {
head = f2 = swapKNodes(f1, f2, k);
}
else {
f2 = swapKNodes(f1, f2, k);
}
f1 = f2;
f1 = nowNode;
}
else if (count%k == 0) {
f2 = nowNode;
}
count++;
nowNode = nowNode->next;
}
return head;
}
};