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

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


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

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

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

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

  • जब तक हेड नल नहीं है:

    • sum := sum + हेड का मान, m[sum] := हेड सेट करें, और हेड := हेड का नेक्स्ट

  • हेड := डमी

  • sum := 0

  • जब तक हेड नल नहीं है:

    • sum := sum + हेड का मान

    • temp := m[sum]

    • यदि temp हेड नहीं है, तो हेड का नेक्स्ट := temp का नेक्स्ट

    • हेड := हेड का नेक्स्ट

  • डमी का नेक्स्ट लौटाएं

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

उदाहरण

#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. C++ में लिंक्ड सूची के वैकल्पिक नोड्स का योग C++ में लिंक्ड सूची के वैकल्पिक नोड्स का योग

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

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

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

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

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