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

C++ में लिंक्ड लिस्ट से ज़ीरो सम लगातार नोड्स निकालें

मान लीजिए हमने एक लिंक्ड लिस्ट का हेड दिया है; हमें बार-बार नोड्स के लगातार अनुक्रमों को हटाना होगा जो कि 0 तक का योग है जब तक कि ऐसा कोई क्रम न हो। तो ऐसा करने के बाद हमें फाइनल लिंक्ड लिस्ट का हेड वापस करना होगा। तो अगर सूची [1,2,-3,3,1] जैसी है, तो परिणाम [3,1] होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • डमी नामक एक नोड बनाएं, और उसमें 0 स्टोर करें, डमी के आगे सेट करें:=हेड

  • एक नक्शा m बनाएं, कुंजी 0 से m के लिए डमी स्टोर करें, योग =0 सेट करें

  • जबकि सिर शून्य नहीं है -

    • योग:=योग + सिर का मूल्य, सेट एम [योग]:=सिर, और सिर:=सिर के बगल में

  • सिर :=डमी

  • योग :=0

  • जबकि सिर शून्य नहीं है

    • योग :=योग + शीर्ष का मूल्य

    • अस्थायी:=एम [योग]

    • अगर टेम्परेचर हेड नहीं है, तो हेड के आगे:=टेम्परेचर के आगे

    • सिर :=सिर के बगल में

  • डमी के आगे लौटें

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

उदाहरण

#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* removeZeroSumSublists(ListNode* head) {
      ListNode* dummy = new ListNode(0);
      dummy->next = head;
      unordered_map <int, ListNode*> m;
      m[0] = dummy;
      int sum = 0;
      while(head){
         sum += head->val;
         m[sum] = head;
         head = head->next;
      }
      head = dummy;
      sum = 0;
      while(head){
         sum += head->val;
         ListNode* temp = m[sum];
         if(temp != head){
            head->next = temp->next;
         }
         head = head->next;
      }
      return dummy->next;
   }
};
main(){
   vector<int> v1 = {1,2,-3,3,1};
   ListNode *head = make_list(v1);
   Solution ob;
   print_list(ob.removeZeroSumSublists(head));
}

इनपुट

[1,2,-3,3,1]

आउटपुट

[3,1]

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

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

  1. C++ में सर्कुलर लिंक्ड लिस्ट में नोड्स गिनें

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

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

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