Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ का उपयोग करके दिए गए आकार के समूहों में लिंक्ड लिस्ट को उल्टा करें


इस लेख में, हम एक सिंगली लिंक्ड लिस्ट से निपटते हैं, और कार्य k के समूहों में लिस्ट को उल्टा करना है। उदाहरण के लिए -

इनपुट: 1→2→3→4→5→6→7→8→NULL, K = 3 आउटपुट: 3→2→1→6→5→4→8→7→NULL इनपुट: 1→2→3→4→5→6→7→8→NULL, K = 5 आउटपुट: 5→4→3→2→1→8

इस समस्या के लिए, एक दृष्टिकोण जो दिमाग में आता है वह है लिस्ट को ट्रैवर्स करना और जब हमारे सबलिस्ट का आकार k तक पहुंच जाए तो लिस्ट को उल्टा करना और जारी रखना।

समाधान खोजने का दृष्टिकोण

इस दृष्टिकोण में, हम आमतौर पर लिस्ट के माध्यम से ट्रैवर्स करेंगे और अपने सब-लिस्ट में तत्वों की संख्या गिनने के लिए एक काउंटर रखेंगे। जब काउंटर k की गिनती तक पहुंच जाता है, तो हम उस भाग को उल्टा कर देते हैं।

उदाहरण

#include <bits/stdc++.h> using namespace std; class Node {    public:    int data;    Node* next; }; Node* reverse(Node* head, int k) {    if (!head)       return NULL;    Node* curr = head;    Node* next = NULL;    Node* prev = NULL;    int count = 0;    while (curr != NULL && count < k) { // हम लिस्ट को तब तक उल्टा करते हैं जब तक हमारी गिनती k से कम है       next = curr->next;       curr->next = prev;       prev = curr;       curr = next;       count++;    }    if (next != NULL) // यदि हमारी लिंक्ड लिस्ट समाप्त नहीं हुई है तो हम फिर से रिवर्स फंक्शन को कॉल करते हैं       head->next = reverse(next, k);    return prev; } void push(Node** head_ref, int new_data) { // लिस्ट में डेटा डालने का फंक्शन    Node* new_node = new Node();    new_node->data = new_data;    new_node->next = (*head_ref);    (*head_ref) = new_node; } void printList(Node* node) { // लिंक्ड लिस्ट प्रिंट करने का फंक्शन    while (node != NULL) {       cout << node->data << " ";       node = node->next;    }    cout << "\n"; } int main() {    Node* head = NULL;    int k = 3; // दिया गया k    push(&head, 8);    push(&head, 7);    push(&head, 6);    push(&head, 5);    push(&head, 4);    push(&head, 3);    push(&head, 2);    push(&head, 1);    cout << "Original list \n";    printList(head);    head = reverse(head, k); // यह फंक्शन हमें हमारा नया हेड लौटाएगा    cout << "New list \n";    printList(head);    return (0); }

आउटपुट

Original list 1 2 3 4 5 6 7 8 New list 3 2 1 6 5 4 8 7 

उपरोक्त दृष्टिकोण की समय जटिलता O(N) है, जहां N हमारी दी गई लिस्ट का आकार है, और यह दृष्टिकोण रिकर्सन पर काम करता है। यह दृष्टिकोण उच्च प्रतिबंधों के लिए भी काम कर सकता है।

उपरोक्त कोड की व्याख्या

हम इस दृष्टिकोण में सरणी के माध्यम से ट्रैवर्स करेंगे और इसे तब तक उल्टा करते रहेंगे जब तक हमारा काउंटर वेरिएबल k से कम है। जब हमारा काउंटर k के मान तक पहुंच जाता है, तो हम इस सब-लिस्ट के अंतिम नोड को अगली उल्टी सब-लिस्ट के पहले नोड से जोड़ने के लिए एक और रिवर्सिंग फंक्शन को कॉल करते हैं। यह रिकर्सन द्वारा किया जा रहा है।

निष्कर्ष

इस लेख में, हम रिकर्सन का उपयोग करके दिए गए आकार के समूहों में लिंक्ड लिस्ट को उल्टा करने की समस्या को हल करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और पूरा दृष्टिकोण (सामान्य) भी सीखा जिससे हमने इस समस्या को हल किया। हम अन्य भाषाओं जैसे C, जावा, पायथन और अन्य भाषाओं में भी वही प्रोग्राम लिख सकते हैं। हमें उम्मीद है कि आपको यह लेख उपयोगी लगा होगा।


  1. C++ में पुनरावृत्ति का उपयोग करके लिंक्ड लिस्ट के वैकल्पिक नोड्स प्रिंट करें C++ में पुनरावृत्ति का उपयोग करके लिंक्ड लिस्ट के वैकल्पिक नोड्स प्रिंट करें

    लिंक्ड लिस्ट एक रैखिक डेटा संरचना है जो तत्वों को गैर-सन्निहित मेमोरी स्थानों में संग्रहीत करती है। प्रत्येक तत्व में लिंक्ड लिस्ट के अगले तत्व का एक पॉइंटर होता है। उदाहरण - इस समस्या में, हमें एक लिंक्ड लिस्ट दी गई है और हमें इस लिंक्ड लिस्ट के तत्वों को प्रिंट करना है लेकिन केवल वैकल्पिक तत्वों

  1. - पायथन में लिंक्ड लिस्ट को k आकार के समूहों द्वारा उलटने का प्रोग्राम

    मान लीजिए हमारे पास एक सिंगली लिंक्ड लिस्ट है, और एक मान k है, हमें प्रत्येक k सन्निकट नोड्स के समूह को उलटना है।इसलिए, यदि इनपुट List = [1,2,3,4,5,6,7,8,9,10], k = 3 जैसा है, तो आउटपुट [3, 2, 1, 6, 5, 4, 9, 8, 7, 10] होगा।इसे हल करने के लिए, हम इन चरणों का पालन करेंगे −tmp := मान 0 के साथ एक

  1. - पायथन में लिंक्ड लिस्ट उल्टा करें

    मान लीजिए हमारे पास एक लिंक्ड लिस्ट है, हमें इसे उल्टा करना है। यदि लिस्ट 1 → 3 → 5 → 7 जैसी है, तो नई उल्टी लिस्ट 7 → 5 → 3 → 1 होगी। इसे हल करने के लिए हम इस दृष्टिकोण का पालन करेंगे: लिस्ट रिवर्सल को पुनरावर्ती तरीके से करने के लिए एक प्रक्रिया परिभाषित करें solve(head, back) यदि head मौजूद नही