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

C++ का उपयोग करके लिंक की गई सूची को उलट दें

इस लेख में, हमें सिंगल लिंक्ड लिस्ट की मदद से लिंक्स को उलटने की जरूरत है। हमारा काम एक ऐसा फंक्शन बनाना है जो दी गई सिंगल लिंक्ड लिस्ट को उलटने में सक्षम हो। उदाहरण के लिए

Input:
Following Linked list :
1->2->3->4->NULL

Output:
After processing of our function:
4->3->2->1->NULL

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

लिंक की गई सूची को उलटने के लिए अलग-अलग तरीके हैं। आम तौर पर, हमारे दिमाग में एक आसान तरीका आता है कि हम सूची को पार करें और इसे पढ़ते समय इसे उलट दें।

सरल तरीका

हम इस दृष्टिकोण में लिंक की गई सूची के माध्यम से जाएंगे और इसके माध्यम से जाने के दौरान इसे उलटने का प्रयास करेंगे।

उदाहरण

#include<bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
   Node(int data) {
      this->data = data;
      next = NULL;
   }
};
struct LinkedList {
   Node* head;
   LinkedList() { head = NULL; }
   // Function to print linked list
   void reverse() {
      auto curr = head; // current pointer
      Node* prev = NULL; // previous pointer
      while(curr) {
         auto temp = curr -> next;
         curr -> next = prev;
         prev = curr;
         head = prev;
         curr = temp;
      }
   }
   void print() {
      struct Node* temp = head;
      while (temp != NULL) {
         cout << temp->data << " ";
         temp = temp->next;
      }
   }
   void push(int data) {
      Node* temp = new Node(data);
      temp->next = head;
      head = temp;
   }
};
int main() {
   LinkedList list;
   list.push(20);
   list.push(4);
   list.push(15);
   list.push(85);
   list.print();
   list.reverse();
   cout << "\n";
   list.print();
}

आउटपुट

85 15 4 20
20 4 15 85

इस दृष्टिकोण में, हम बस सूची के माध्यम से आगे बढ़ रहे हैं और जैसे ही हम इसके माध्यम से जाते हैं, उलट जाते हैं। यह एक अच्छा तरीका है क्योंकि समय जटिलता O(N) . है , जहां N हमारी सूची का आकार है।

अब हम एक प्रयोग करने का प्रयास करते हैं जहां हम सूची को उलटने के लिए स्टैक का उपयोग करने का प्रयास करते हैं।

स्टैक के साथ दृष्टिकोण

हम इस प्रोग्राम में सभी नोड्स को स्टोर करने के लिए एक स्टैक का उपयोग करेंगे और स्टैक के माध्यम से उन्हें उलट देंगे।

उदाहरण

#include<bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
   Node(int data) {
      this->data = data;
      next = NULL;
   }
};
struct LinkedList {
   Node* head;
   LinkedList() { head = NULL; }
   // Function to print linked list
   void reverse() {
      auto curr = head; // current pointer
      Node* prev = NULL; // previous pointer
      stack<Node *> s;
      while(curr) {
         s.push(curr);
         curr = curr -> next;
      }
      prev = s.top();
      head = prev;
      s.pop();
      while(!s.empty()) {
         auto temp = s.top();
         s.pop();
         prev -> next = temp;
         prev = temp;
      }
      prev -> next = NULL;
   }
   void print() {
      struct Node* temp = head;
      while (temp != NULL) {
         cout << temp->data << " ";
         temp = temp->next;
      }
   }
   void push(int data) {
      Node* temp = new Node(data);
      temp->next = head;
      head = temp;
   }
};
int main() {
   LinkedList list;
   list.push(20);
   list.push(4);
   list.push(15);
   list.push(85);
   list.print();
   list.reverse();
   cout << "\n";
   list.print();
}

आउटपुट

85 15 4 20
20 4 15 85

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

इस दृष्टिकोण में, हम सूची नोड्स को इसके माध्यम से जाने के दौरान एक स्टैक में संग्रहीत करते हैं और फिर उन्हें पॉप करने और सूची को उलटने के लिए स्टैक का उपयोग करते हैं; इस दृष्टिकोण में ओ (एन) की समय जटिलता भी है, जहां एन हमारी सूची का आकार है। पहले की तरह, हम स्टैक का उपयोग कर रहे थे, इसलिए हम एक पुनरावर्ती दृष्टिकोण का भी उपयोग कर सकते हैं क्योंकि वह भी स्टैक का उपयोग करता है, इसलिए अब हम एक पुनरावर्ती दृष्टिकोण बनाएंगे।

पुनरावर्ती दृष्टिकोण

इस दृष्टिकोण में, हम पहले की तरह ही प्रक्रिया करेंगे लेकिन पुनरावर्ती कॉल के साथ।

उदाहरण

#include<bits/stdc++.h>
using namespace std;
struct Node {
   int data;
   struct Node* next;
   Node(int data) {
      this->data = data;
      next = NULL;
      }
   };
   struct LinkedList {
      Node* head;
      LinkedList() { head = NULL; }
      // Function to print linked list
      void rreverse(Node *curr, Node *prev) {
         if(curr == NULL) {
            // prev -> next = curr;
            head = prev;
            return;
         }
         rreverse(curr -> next, curr);
         curr -> next = prev;
         prev -> next = NULL;
      }

      void reverse() {
         auto curr = head; // current pointer
         Node* prev = NULL; // previous pointer
         rreverse(curr -> next, curr);
      }
      void print() {
         struct Node* temp = head;
         while (temp != NULL) {
         cout << temp->data << " ";
         temp = temp->next;
      }
   }
   void push(int data) {
      Node* temp = new Node(data);
      temp->next = head;
      head = temp;
   }
};
int main() {
   LinkedList list;
   list.push(20);
   list.push(4);
   list.push(15);
   list.push(85);
   list.print();
   list.reverse();
   cout << "\n";
   list.print();
}

आउटपुट

85 15 4 20
20 4 15 85

इस दृष्टिकोण में, हम पहले की तरह ही कर रहे हैं, लेकिन पुनरावर्ती कॉल के साथ, इसलिए इस दृष्टिकोण में O(N) की समय जटिलता भी है। , जहां N हमारी सूची का आकार है।

निष्कर्ष

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


  1. सी ++ में डबल लिंक्ड सूची का उपयोग कर प्राथमिकता कतार

    हमें डेटा और प्राथमिकता एक पूर्णांक मान के रूप में दी जाती है और कार्य दी गई प्राथमिकता के अनुसार एक डबल लिंक्ड सूची बनाना और परिणाम प्रदर्शित करना है। Queue एक FIFO डेटा संरचना है जिसमें जो तत्व पहले डाला जाता है वह सबसे पहले निकाला जाता है। प्राथमिकता कतार एक प्रकार की कतार है जिसमें प्राथमिकता क

  1. सी ++ में लिंक्ड लिस्ट का उपयोग करके दो बहुपदों को जोड़ना।

    इस अवधारणा को बेहतर ढंग से समझने के लिए आइए सबसे पहले आवश्यक सभी बुनियादी सामग्री को ब्रश करें। लिंक की गई सूची एक डेटा संरचना है जो सूची के नोड में प्रत्येक तत्व को एक वस्तु के रूप में संग्रहीत करती है। प्रत्येक नोट में दो भाग डेटा होते हैं और अगले नोड से लिंक होते हैं। बहुपद एक गणितीय व्यंजक है

  1. सी ++ प्रोग्राम लिंक्ड लिस्ट का उपयोग करके ग्राफ का प्रतिनिधित्व करने के लिए

    एक ग्राफ की घटना मैट्रिक्स स्मृति में संग्रहीत करने के लिए एक ग्राफ का एक और प्रतिनिधित्व है। यह मैट्रिक्स एक वर्ग मैट्रिक्स नहीं है। आपतन मैट्रिक्स का क्रम V x E है। जहाँ V शीर्षों की संख्या है और E ग्राफ़ में किनारों की संख्या है। इस मैट्रिक्स की प्रत्येक पंक्ति में हम कोने रख रहे हैं, और प्रत्ये