#include <bits/stdc++.h>
using namespace std;
// Node structure for linked list
struct Node {
int data;
Node* next;
Node(int val) : data(val), next(NULL) {}
};
// Function to insert at end
void insertEnd(Node*& head, int val) {
Node* newNode = new Node(val);
if (!head) {
head = newNode;
return;
}
Node* temp = head;
while (temp->next) temp = temp->next;
temp->next = newNode;
}
// Function to print linked list
void printList(Node* head) {
while (head) {
cout << head->data;
if (head->next) cout << "->";
head = head->next;
}
cout << "\n";
}
// Reverse entire linked list
Node* reverseList(Node* head) {
Node* prev = NULL;
Node* curr = head;
while (curr) {
Node* nextNode = curr->next;
curr->next = prev;
prev = curr;
curr = nextNode;
}
return prev;
}
// Clone linked list (without random pointer)
Node* cloneList(Node* head) {
if (!head) return NULL;
Node* newHead = new Node(head->data);
Node* tempNew = newHead;
Node* tempOld = head->next;
while (tempOld) {
tempNew->next = new Node(tempOld->data);
tempNew = tempNew->next;
tempOld = tempOld->next;
}
return newHead;
}
// Reverse K nodes in-place
Node* reverseKGroup(Node* head, int k) {
Node* curr = head;
int count = 0;
// Check if we have k nodes
Node* temp = head;
for (int i = 0; i < k; i++) {
if (!temp) return head;
temp = temp->next;
}
Node* prev = NULL;
Node* nextNode = NULL;
// Reverse first k nodes
while (curr && count < k) {
nextNode = curr->next;
curr->next = prev;
prev = curr;
curr = nextNode;
count++;
}
// Recursive call for the rest
if (nextNode) head->next = reverseKGroup(nextNode, k);
return prev;
}
int main() {
Node* head = NULL;
// Create Linked List: 1->2->3->4->5
insertEnd(head, 1);
insertEnd(head, 2);
insertEnd(head, 3);
insertEnd(head, 4);
insertEnd(head, 5);
cout << "Original List: ";
printList(head);
// Reverse entire list
Node* rev = reverseList(head);
cout << "Reversed List: ";
printList(rev);
// Clone list
Node* clone = cloneList(rev);
cout << "Cloned List: ";
printList(clone);
// Reverse every K nodes
int k = 2;
Node* kRev = reverseKGroup(clone, k);
cout << "K-Group Reversed List (k=" << k << "): ";
printList(kRev);
return 0;
}