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

C++ में रैंडम पॉइंटर के साथ लिस्ट कॉपी करें

लिंक्ड लिस्ट एक रैखिक डेटा संरचना है जिसमें प्रत्येक नोड के दो ब्लॉक होते हैं जैसे कि एक ब्लॉक में नोड का मान या डेटा होता है और दूसरा ब्लॉक अगले फील्ड का पता रखता है।

मान लीजिए हमारे पास एक लिंक्ड लिस्ट है जैसे कि प्रत्येक नोड में एक रैंडम पॉइंटर होता है जो लिस्ट में अन्य नोड्स की ओर इंगित करता है। कार्य मूल लिस्ट के समान ही लिस्ट का निर्माण करना है। मूल लिस्ट से लिस्ट की कॉपी करना जिसमें कुछ रैंडम पॉइंटर होते हैं, लिंक्ड लिस्ट की 'डीप कॉपी' कहलाती है।

उदाहरण के लिए

इनपुट-1

           C++ में रैंडम पॉइंटर के साथ लिस्ट कॉपी करें

आउटपुट:

5-> 2 -> 3 -> 7 ->4 ->

व्याख्या: यदि हम दी गई लिंक्ड लिस्ट में मूल नोड्स के मान के साथ नई लिस्ट को जोड़ते हैं और मूल लिंक्ड लिस्ट के रैंडम पॉइंटर को नई लिस्ट में अगले नोड से बदलते हैं, तो यह 5-> 2-> 3-> 7-> 4-> बन जाएगी।

इस समस्या को हल करने का दृष्टिकोण

हमारे पास डेटा और रैंडम पॉइंटर वाले नोड्स के साथ एक लिंक्ड लिस्ट है। लिंक्ड लिस्ट की डेटा और रैंडम पॉइंटर के साथ कॉपी प्राप्त करने के लिए, हम पहले प्रत्येक नोड के बाद उसी मान के साथ नया नोड जोड़ेंगे। यह प्रत्येक नोड के बाद डुप्लिकेट नोड बनाएगा।

आरंभीकरण के बाद, लिस्ट में रैंडम पॉइंटर का पथ जांचें और नए बनाए गए नोड में रैंडम पॉइंटर को तदनुसार रखें।

अब मूल लिस्ट में प्रत्येक नोड के बाद नए बनाए गए नोड्स को अलग करने से लिंक्ड लिस्ट की डीप कॉपी बनेगी।

  • डेटा फील्ड और उसके रैंडम नोड के पते के पॉइंटर के साथ एक लिंक्ड लिस्ट लें।
  • एक फ़ंक्शन copyRandomList(listnode*head) मूल लिस्ट के हेड नोड को इनपुट के रूप में लेता है और लिस्ट की डीप कॉपी लौटाता है।
  • यदि हेड खाली है, तो लिस्ट खाली है और हमें हेड भी लौटाना होगा।
  • अब मूल लिस्ट के प्रत्येक नोड के बाद उसी मान के साथ नया नोड डालें।
  • फिर मूल लिस्ट से रैंडम पॉइंटर कॉपी करें और नए नोड्स डालें, यानी newnode->next = curr->randomPointer
  • एक बार पॉइंटर और डेटा के साथ नया नोड बन जाने पर, हम लिस्ट को अलग करेंगे और आउटपुट के रूप में लिस्ट लौटाएंगे।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
struct listnode {
    int data;
    listnode * next, * random;
    listnode(int d) {
        data = d;
        next = NULL;
        random = NULL;
    }
};
void print(listnode * head) {
    listnode * curr = head;
    while (curr) {
        cout << curr -> data << " " << curr -> random -> data << endl;
        curr = curr -> next;
    }
}
listnode * copyRandomList(listnode * head) {
    if (!head) {
        return head;
    }
    // मूल लिस्ट में प्रत्येक नोड के बाद उसी मान के साथ नया नोड डालें।
    listnode * curr = head;
    while (curr) {
        listnode * newHead = new listnode(curr -> data);
        newHead -> next = curr -> next;
        curr -> next = newHead;
        curr = curr -> next -> next;
    }
    // अब नए बनाए गए नोड के साथ रैंडम पॉइंटर रखें।
    curr = head;
    while (curr) {
        if (curr -> random)
            (curr -> next) -> random = (curr -> random) -> next;
        curr = curr -> next -> next;
    }
    // अब नए बनाए गए लिस्ट को अलग करें
    curr = head;
    listnode * result = curr -> next;
    listnode * dummyHead = new listnode(-1);
    dummyHead -> next = result;
    while (curr) {
        curr -> next = result -> next;
        curr = curr -> next;
        if (curr) {
            result -> next = curr -> next;
        }
        result = result -> next;
    }
    result = dummyHead -> next;
    delete dummyHead;
    return result;
}
int main() {
    listnode * head = new listnode(5);
    head -> next = new listnode(6);
    head -> next -> next = new listnode(3);
    head -> next -> next -> next = new listnode(4);
    head -> next -> next -> next -> next = new listnode(2);
    head -> random = head -> next -> next;
    head -> next -> random = head;
    head -> next -> next -> random = head -> next -> next -> next -> next;
    head -> next -> next -> next -> random = head -> next -> next -> next -> next;
    head -> next -> next -> next -> next -> random = head -> next;
    cout << "Original list :" << endl;
    print(head);
    cout << "Deep Copy of the List:" << endl;
    listnode * deep_copyList = copyRandomList(head);
    print(deep_copyList);
    return 0;
}

उपरोक्त कोड चलाने से आउटपुट इस प्रकार उत्पन्न होगा,

आउटपुट

Original List: 5 3 6 5 3 2 4 2 2 6 Deep Copy of the List: 5 3 6 5 3 2 4 2 2 6
  1. C++ में लिंक्ड लिस्ट में मनमाना पॉइंटर को दाईं ओर के सबसे बड़े मान वाले नोड पर इंगित करना C++ में लिंक्ड लिस्ट में मनमाना पॉइंटर को दाईं ओर के सबसे बड़े मान वाले नोड पर इंगित करना

    इस समस्या में, हमें एक लिंक्ड लिस्ट दी गई है जिसमें एक मान, लिंक पॉइंटर और एक मनमाना पॉइंटर है। हमारा कार्य मनमाना पॉइंटर को लिंक्ड लिस्ट में उसके दाईं ओर के सबसे बड़े मान की ओर इंगित करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, यहां, हम लिंक्ड लिस्ट के निम्नलिखित मनमाना पॉइंटर्स देख सकते ह

  1. C++ में लिंक्ड लिस्ट में मनमाना पॉइंटर को अगले उच्च मान वाले नोड पर इंगित करना C++ में लिंक्ड लिस्ट में मनमाना पॉइंटर को अगले उच्च मान वाले नोड पर इंगित करना

    इस समस्या में, हमें एक लिंक्ड लिस्ट दी गई है जिसमें एक मान, लिंक पॉइंटर और एक मनमाना पॉइंटर है। हमारा कार्य मनमाना पॉइंटर को सूची में अगले बड़े मान की ओर इंगित करना है। समस्या को समझने के लिए एक उदाहरण लेते हैं, यहां, हम देख सकते हैं 8 12 की ओर इंगित करता है, 12 41 की ओर, 41 54 की ओर, 54 76 की ओर

  1. - Python में Random Pointer के साथ List Copy करें

    Linked List एक linear data structure है जिसमें प्रत्येक node के दो blocks होते हैं जैसे कि एक block में node का value या data होता है और दूसरे block में next field का address होता है। मान लीजिए हमारे पास एक linked list है जैसे कि प्रत्येक node में एक random pointer होता है जो list में अन्य nodes को