和leetcode上原题不同的是,如果最后一组元素构成的子链表长度小于k,则一并反转
代码如下:
#include <iostream>
using namespace std;
struct Node
{
int value;
Node* next = nullptr;
Node(int v) :value(v) {}
};
Node *reverseList(Node *head, Node *tail)
{
Node* tailAfterReverse = head->next;
while (head->next != tail)
{
Node* temp = head->next;
head->next = temp->next;
temp->next = tail->next;
tail->next = temp;
}
return tailAfterReverse;
}
void reverseListKGroup(Node* head, size_t k)
{
if (head->next == nullptr)
return;
Node* tail = head->next;
Node* first = head;
while (true)
{
size_t count = 1;
while (tail->next != nullptr && count < k)
{
tail = tail->next;
++count;
}
first = reverseList(first, tail);
if (first->next == nullptr)
break;
tail = first->next;
}
}
int main()
{
const int N = 10;
size_t k = 2;
Node* head = new Node(-1);
Node* tail = head;
for (int i = 1; i <= N; ++i)
{
Node* cur = new Node(i);
tail->next = cur;
tail = cur;
}
cout << k << "个一组反转前:" << endl;
tail = head->next;
while (tail != nullptr)
{
cout << tail->value << " ";
tail = tail->next;
}
cout << endl;
reverseListKGroup(head, k);
cout << k << "个一组反转后:" << endl;
tail = head->next;
while (tail != nullptr)
{
cout << tail->value << " ";
tail = tail->next;
}
cout << endl;
return 0;
}