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

C++ में रिवर्स लिंक्ड लिस्ट II

मान लीजिए हमारे पास एक लिंक्ड सूची है। हमें नोड्स को स्थिति m से n तक उलटना होगा। हमें इसे एक पास में करना होगा। इसलिए यदि सूची [1,2,3,4,5] और m =2 और n =4 है, तो परिणाम [1,4,,3,2,5]

होगा।

आइए चरणों को देखें -

  • दो तरीके होंगे, रिवर्सएन () और रिवर्सबीच ()। रिवर्सबीच () मुख्य विधि के रूप में काम करेगा।
  • एक लिंक नोड पॉइंटर को सक्सेसर के रूप में परिभाषित करें जिसे नल कहा जाता है
  • रिवर्सएन निम्नानुसार काम करेगा -
  • अगर n =1, तो उत्तराधिकारी :=शीर्ष के आगे, और वापसी शीर्ष
  • अंतिम =रिवर्सएन(सिर के आगे, n -1)
  • अगले (सिर के बगल में) =सिर, और सिर के आगे:=उत्तराधिकारी, अंतिम वापसी
  • reverseBetween() विधि इस तरह होगी -
  • अगर एम =1 है, तो रिवर्सएन (हेड, एन) वापस लौटें
  • सिर के आगे :=रिवर्सबीच (सिर के आगे, m-1, n-1)

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class ListNode{
   public:
      int val;
      ListNode *next;
      ListNode(int data){
         val = data;
         next = NULL;
      }
   };
   ListNode *make_list(vector<int> v){
      ListNode *head = new ListNode(v[0]);
      for(int i = 1; i<v.size(); i++){
         ListNode *ptr = head;
         while(ptr->next != NULL){
            ptr = ptr->next;
         }
         ptr->next = new ListNode(v[i]);
      }
      return head;
   }
   void print_list(ListNode *head){
      ListNode *ptr = head;
      cout << "[";
      while(ptr){
         cout << ptr->val << ", ";
         ptr = ptr->next;
      }
      cout << "]" << endl;
 }
 class Solution {
   public:
      ListNode* successor = NULL;
      ListNode* reverseN(ListNode* head, int n ){
         if(n == 1){
            successor = head->next;
            return head;
         }
         ListNode* last = reverseN(head->next, n - 1);
         head->next->next = head;
         head->next = successor;
         return last;
      }
      ListNode* reverseBetween(ListNode* head, int m, int n) {
      if(m == 1){
            return reverseN(head, n);
      }
      head->next = reverseBetween(head->next, m - 1, n - 1);
            return head;
   }
 };
main(){
   Solution ob;
   vector<int> v = {1,2,3,4,5,6,7,8};
   ListNode *head = make_list(v);
   print_list(ob.reverseBetween(head, 2, 6));
}

इनपुट

[1,2,3,4,5,6,7,8]
2
6

आउटपुट

[1, 6, 5, 4, 3, 2, 7, 8, ]

  1. C++ में एक क्रमबद्ध लिंक्ड सूची में माध्यिका ढूँढना

    इस समस्या में, हमें N तत्वों से युक्त एक क्रमबद्ध लिंक्ड सूची दी गई है। हमारा काम एक क्रमबद्ध लिंक्ड सूची में माध्यिका खोजना . है । सॉर्ट की गई लिंक की गई सूची एक साधारण लिंक्ड सूची है जिसमें सभी तत्वों को एक विशिष्ट क्रम में क्रमबद्ध किया जाता है। उदाहरण NULL माध्यिका लिंक्ड सूची का मध्य तत्व है।

  1. सी ++ में एक लिंक्ड सूची को समतल करना

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

  1. सी++ में लिंक्ड सूची के वैकल्पिक नोड्स का योग

    इस समस्या में हमें एक लिंक्ड लिस्ट दी जाती है। हमारा काम लिंक की गई सूची के वैकल्पिक नोड्स के योग को प्रिंट करना है। लिंक्ड सूची डेटा संरचना का एक क्रम है जो लिंक के माध्यम से एक साथ जुड़े होते हैं। अब, समस्या पर वापस आते हैं। यहां, हम लिंक की गई सूची के वैकल्पिक नोड्स जोड़ेंगे। इसका मतलब है कि ह