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

C++ किसी दी गई लिंक्ड सूची के तत्वों को पेयरवाइज स्वैप करें

एक समस्या को हल करने के लिए जिसमें हमें एक लिंक्ड सूची में मौजूद जोड़ीदार नोड्स को स्वैप करना होता है और फिर इसे प्रिंट करना होता है, उदाहरण के लिए

Input : 1->2->3->4->5->6->NULL

Output : 2->1->4->3->6->5->NULL

Input : 1->2->3->4->5->NULL

Output : 2->1->4->3->5->NULL

Input : 1->NULL

Output : 1->NULL

ओ (एन) की समय जटिलता दोनों के समाधान तक पहुंचने के दो तरीके हैं, जहां एन हमारी प्रदान की गई लिंक्ड सूची का आकार है, इसलिए अब हम दोनों दृष्टिकोणों का पता लगाने जा रहे हैं

पुनरावर्ती दृष्टिकोण

हम इस दृष्टिकोण में लिंक किए गए सूची तत्वों के माध्यम से पुनरावृति करेंगे, और जब तक वे NULL तक नहीं पहुंच जाते, तब तक उन्हें जोड़ीदार स्वैप करते हैं।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Node { // node of our list
public:
    int data;
    Node* next;
};
void swapPairwise(Node* head){
    Node* temp = head;
    while (temp != NULL && temp->next != NULL) { // for pairwise swap we need to have 2 nodes hence we are checking
        swap(temp->data,
            temp->next->data); // swapping the data
        temp = temp->next->next; // going to the next pair
    }
}
void push(Node** head_ref, int new_data){ // function to push our data in list
    Node* new_node = new Node(); // creating new node
    new_node->data = new_data;
    new_node->next = (*head_ref); // head is pushed inwards
    (*head_ref) = new_node; // our new node becomes our head
}
void printList(Node* node){ // utility function to print the given linked list
    while (node != NULL) {
       cout << node->data << " ";
       node = node->next;
    }
}
int main(){
    Node* head = NULL;
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
    cout << "Linked list before\n";
    printList(head);
    swapPairwise(head);
    cout << "\nLinked list after\n";
    printList(head);
    return 0;
}

आउटपुट

Linked list before
1 2 3 4 5
Linked list after
2 1 4 3 5

हम अपने निम्नलिखित दृष्टिकोण में उसी सूत्र का उपयोग करेंगे, लेकिन हम पुनरावर्तन के माध्यम से पुनरावृति करेंगे।

पुनरावर्ती दृष्टिकोण

इस दृष्टिकोण में, हम उसी तर्क को पुनरावर्तन के साथ लागू कर रहे हैं।

उदाहरण

#include <bits/stdc++.h>
using namespace std;
class Node { // node of our list
public:
    int data;
    Node* next;
};
void swapPairwise(struct Node* head){
    if (head != NULL && head->next != NULL) { // same condition as our iterative
        swap(head->data, head->next->data); // swapping data
        swapPairwise(head->next->next); // moving to the next pair
    }
    return; // else return
}
void push(Node** head_ref, int new_data){ // function to push our data in list
    Node* new_node = new Node(); // creating new node
    new_node->data = new_data;
    new_node->next = (*head_ref); // head is pushed inwards
    (*head_ref) = new_node; // our new node becomes our head
}
void printList(Node* node){ // utility function to print the given linked list
    while (node != NULL) {
        cout << node->data << " ";
        node = node->next;
    }
}
int main(){
    Node* head = NULL;
    push(&head, 5);
    push(&head, 4);
    push(&head, 3);
    push(&head, 2);
    push(&head, 1);
    cout << "Linked list before\n";
    printList(head);
    swapPairwise(head);
    cout << "\nLinked list after\n";
    printList(head);
    return 0;
}

आउटपुट

Linked list before
1 2 3 4 5
Linked list after
2 1 4 3 5

उपरोक्त कोड की व्याख्या

इस दृष्टिकोण में, हम अपनी लिंक्ड सूची को जोड़ियों में पार करते हैं। अब, जैसे ही हम एक जोड़ी तक पहुँचते हैं, हम उनके डेटा की अदला-बदली करते हैं और अगले जोड़े में चले जाते हैं, और इस तरह हमारा प्रोग्राम दोनों तरीकों से आगे बढ़ता है।

निष्कर्ष

इस ट्यूटोरियल में, हम रिकर्सन और इटरेशन का उपयोग करके दी गई लिंक्ड लिस्ट के पेयरवाइज स्वैप एलिमेंट्स को हल करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और संपूर्ण दृष्टिकोण (Normal) भी सीखा जिसके द्वारा हमने इस समस्या को हल किया। हम उसी प्रोग्राम को अन्य भाषाओं जैसे सी, जावा, पायथन और अन्य भाषाओं में लिख सकते हैं। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगा होगा।


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

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

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

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

  1. जांचें कि क्या लिंक की गई सूची को C++ में पेयरवाइज सॉर्ट किया गया है

    हमारे पास n तत्वों के साथ एक सूची L है। हमें यह जांचना है कि सूची जोड़ी के अनुसार क्रमबद्ध है या नहीं। मान लीजिए कि सूची {8, 10, 18, 20, 5, 15} जैसी है। यह जोड़ी के अनुसार क्रमबद्ध है (8, 10), (18, 20), (5, 15) क्रमबद्ध हैं। यदि सूची में तत्वों की विषम संख्या है, तो अंतिम को अनदेखा कर दिया जाएगा। द