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

C++ में लिंक्ड लिस्ट में पहला गैर-दोहराव वाला तत्व खोजना

समस्या विवरण

इस समस्या में, हमें आकार N की एक लिंक्ड लिस्ट LL दी गई है। हमारा कार्य लिंक्ड लिस्ट में गैर-दोहराव वाला तत्व खोजने के लिए एक प्रोग्राम बनाना है।

लिंक्ड लिस्ट डेटा संरचनाओं का एक क्रम है, जो लिंक के माध्यम से एक साथ जुड़े होते हैं।

उदाहरण

इनपुट: LL = 4 → 6 → 2 → 4 → 1 → 2 → 6 → 5
आउटपुट: 1

व्याख्या

एकल घटना आवृत्ति वाले तत्व 1 और 5 हैं। इनमें से 1 लिंक्ड लिस्ट में पहले आया।

हल का दृष्टिकोण

समस्या को हल करने का एक दृष्टिकोण एक हैश टेबल बनाना है जो तत्वों और उनकी घटना आवृत्ति को संग्रहीत करेगा। लिंक्ड लिस्ट में पहले गैर-दोहराव वाले मान को खोजने के लिए, हम लिंक्ड लिस्ट को पार करेंगे और उन तत्वों को डालेंगे जो हैश मैप में मौजूद नहीं हैं, उन्हें प्रारंभिक घटना आवृत्ति 1 के साथ डालेंगे। यदि कोई तत्व हैश मैप में मौजूद है तो उसकी घटना आवृत्ति बढ़ाएं। लिंक्ड लिस्ट को पार करने के बाद, हम हैश मैप में उस मान की जांच करेंगे जिसकी घटना आवृत्ति एक है और पहला मान वापस करेंगे जो मिलता है।

C++ कार्यान्वयन

#include <bits/stdc++.h> 
using namespace std; 

struct Node {
    int data;
    struct Node* next;
};

void push(struct Node** head_ref, int new_data) {
    struct Node* new_node = (struct Node*) malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

int findFirstNonRepLL(struct Node* head) {
    unordered_map<int, int> freqMap;
    
    // आवृत्ति गिनें
    for (Node* temp = head; temp != NULL; temp = temp->next) {
        freqMap[temp->data]++;
    }
    
    // पहली गैर-दोहराव वाली खोजें
    for (Node* temp = head; temp != NULL; temp = temp->next) {
        if (freqMap[temp->data] == 1) {
            return temp->data;
        }
    }
    return -1;
}

int main() {
    struct Node* head = NULL;
    push(&head, 5);
    push(&head, 6);
    push(&head, 2);
    push(&head, 1);
    push(&head, 4);
    push(&head, 2);
    push(&head, 6);
    push(&head, 4);
    
    cout << "लिंक्ड लिस्ट का पहला गैर-दोहराव वाला तत्व है " << findFirstNonRepLL(head);
    return 0;
}

आउटपुट

लिंक्ड लिस्ट का पहला गैर-दोहराव वाला तत्व है 1

जटिलता विश्लेषण

  • समय जटिलता: O(N) - दो पास
  • स्पेस जटिलता: O(N) - हैश मैप के लिए

वैकल्पिक दृष्टिकोण

यदि मानों की रेंज छोटी है (उदाहरण के लिए 0-1000), तो O(1) स्पेस के लिए हैश मैप के बजाय सरणी का उपयोग करें।

  1. - C++ में क्रमबद्ध लिंक्ड लिस्ट में मेडियन खोजना

    समस्या विवरण इस समस्या में, हमें N तत्वों वाली एक क्रमबद्ध लिंक्ड लिस्ट दी गई है। हमारा कार्य क्रमबद्ध लिंक्ड लिस्ट में मेडियन खोजना है। क्रमबद्ध लिंक्ड लिस्ट एक साधारण लिंक्ड लिस्ट है जिसमें सभी तत्व एक विशिष्ट क्रम में क्रमबद्ध होते हैं। उदाहरण: 4 → 6 → 7 → 9 → NULL मेडियन लिंक्ड लिस्ट का मध्य त

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

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

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

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