// 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
// k 是一个正整数,它的值小于或等于链表的长度。
// 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
#include "iostream"
#include "stack"
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
void print(ListNode *head)
{
ListNode *p = head;
while (p != NULL)
{
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
ListNode *reverseKGroup(ListNode *head, int k)
{
if (head == NULL)
{
return NULL;
}
else if (head->next == NULL)
{
return head;
}
ListNode *node = new ListNode(0);
node->next = head;
ListNode *p = node, *f = node, *s;
bool flag = true;
stack<ListNode *> k_node;
// 1 2 3 4 5
// k = 3
while (true)
{
for (int i = 0; i < k; i++)
{
p = p->next;
if (p == NULL)
{
flag = false;
break;
}
k_node.push(p);
}
if (flag)
{
p = p->next;
while (!k_node.empty())
{
f->next = k_node.top();
k_node.pop();
f = f->next;
}
f->next = p;
p = f;
}
else
{
break;
}
}
return node->next;
}
};
int main(int argc, char const *argv[])
{
int k, x;
ListNode *p, *head;
cout << "k=";
cin >> k;
cin >> x;
head = new ListNode(x);
p = head;
while (true)
{
cin >> x;
p->next = new ListNode(x);
p = p->next;
if (cin.get() == '\n')
break;
}
Solution so;
head = so.reverseKGroup(head, k);
so.print(head);
return 0;
}