#include <iostream>
using namespace std;
class Node {
public:
int value;
Node *next;
Node(int val) {
this->value = val;
this->next = NULL;
}
};
Node* createList() {
Node *root = new Node(1);
root->next = new Node(2);
root->next->next = new Node(3);
root->next->next->next = new Node(4);
root->next->next->next->next = new Node(5);
root->next->next->next->next->next = new Node(6);
root->next->next->next->next->next->next = new Node(7);
root->next->next->next->next->next->next->next = new Node(8);
return root;
}
Node *findMiddleNode(Node *root) {
Node* sp = root;
Node* fp = root;
Node* prev = NULL;
while (fp != NULL && fp->next != NULL) {
prev = sp;
sp = sp->next;
fp = fp->next->next;
}
return prev;
}
Node *reverList(Node* root) {
Node* prev = NULL;
Node* next = root->next;
Node* curr = root;
while (curr != NULL) {
curr->next = prev;
prev = curr;
curr = next;
if (next != NULL) {
next = next->next;
}
}
return prev;
}
Node *rearrangeList(Node *root) {
Node* prev;
Node* fList = root;
Node* n = findMiddleNode(root);
Node* sListStart = n->next;
// terminate the first list
n->next = NULL;
Node *sList = reverList(sListStart);
while (fList != NULL && sList != NULL) {
Node* temp = fList->next;
fList->next = sList;
sList = sList->next;
fList->next->next = temp;
prev = fList;
fList = temp;
}
if (fList == NULL && sList != NULL) {
prev->next = sList;
}
if (fList != NULL && sList != NULL) {
fList->next = sList;
}
return root;
}
int main() {
Node* root = createList();
Node *finalList = rearrangeList(root);
while (finalList != NULL) {
cout << finalList->value << " ";
finalList = finalList->next;
}
return 0;
}