#include <stdio.h>
#include <vector>
struct _LIST_NODE
{
int val = 0;
_LIST_NODE* next = nullptr;
_LIST_NODE() :val(0), next(nullptr) {}
_LIST_NODE(int _val):val(_val),next(nullptr){}
};
void ShowList(_LIST_NODE* head) {
while (head) {
printf("%d ", head->val);
head = head->next;
}
printf("\n");
}
auto ReverseListWith(_LIST_NODE* headList, _LIST_NODE* endList)
{
auto nextOfEnds = endList->next;
auto moveHead = headList;
auto nextList = moveHead->next;
while (moveHead && moveHead != endList) {
if (nextList) {
auto nextOfNext = nextList->next;
nextList->next = moveHead;
moveHead = nextList;
nextList = nextOfNext;
}
}
headList->next = nextOfEnds;
return endList;
}
_LIST_NODE* ReverseListWithK(_LIST_NODE* head, int k)
{
if (!head || k == 1) return head;
auto newHead = head;
bool bFirst = true;
_LIST_NODE* currentMoveHead = head;
int currentK = k;
auto currentKHead = head;
_LIST_NODE* preEnd = nullptr;
while (currentKHead)
{
auto currentMoveHead = currentKHead;
currentK = k-1;
while (1) {
if (!currentMoveHead) return newHead;
currentMoveHead = currentMoveHead->next;
--currentK;
if (currentK == 0) {
if (currentMoveHead->next) {
auto _next = currentMoveHead->next;
if (bFirst) {
newHead = ReverseListWith(currentKHead, currentMoveHead);
bFirst = false;
}
else {
ReverseListWith(currentKHead, currentMoveHead);
}
if (preEnd) {
preEnd->next = currentMoveHead;
}
ShowList(newHead);
preEnd = currentKHead;
currentKHead = _next;
break;
}
else {
return newHead;
}
}
}
}
}
auto getEndList(_LIST_NODE* head) {
auto pre = head;
while (head) {
pre = head;
head = head->next;
}
return pre;
}
int main()
{
std::vector<int> vecTest = {1,2,3,4,5,6,7,8,9,10 };
auto head = new _LIST_NODE(vecTest[0]);
auto listMove = head;
for (int i = 1; i < vecTest.size(); ++i) {
listMove->next = new _LIST_NODE(vecTest[i]);
listMove = listMove->next;
}
int k = 5;
ShowList(ReverseListWithK(head, k));
printf("end\n");
return 0;
}