मान लीजिए हमारे पास एक लिंक्ड लिस्ट है: L1 → L2 → L3 → L4 → ... → L(n-1) → Ln। हमें इसे L1 → Ln → L2 → L(n-1) → ... फॉर्म में पुनर्व्यवस्थित करना है। नोड्स के मान नहीं बदल सकते, केवल नोड्स के पॉइंटर्स बदल सकते हैं।
उदाहरण: [1,2,3,4,5] → [1,5,2,4,3]।
मध्य ढूंढें + रिवर्स + मर्ज
- स्लो-फास्ट पॉइंटर्स से लिस्ट का मध्य ढूंढें।
- दूसरे आधे भाग को रिवर्स करें।
- दोनों आधे भागों को बारी-बारी से मर्ज करें।
C++ कार्यान्वयन
#include <bits/stdc++.h>
using namespace std;
class ListNode {
public:
int val;
ListNode *next;
ListNode(int data) { val = data; next = NULL; }
};
class Solution {
public:
ListNode* reverse(ListNode* head) {
ListNode* prev = NULL;
while (head) {
ListNode* next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
void reorderList(ListNode* head) {
if (!head) return;
ListNode *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
}
ListNode* second = reverse(slow->next);
slow->next = NULL;
ListNode* first = head;
while (second) {
ListNode* tmp1 = first->next;
ListNode* tmp2 = second->next;
first->next = second;
second->next = tmp1;
first = tmp1;
second = tmp2;
}
}
};
int main() {
// लिस्ट बनाने और टेस्ट करने का कोड
return 0;
}
इनपुट
[1,2,3,4,5]
आउटपुट
[1, 5, 2, 4, 3, ]