কম্পিউটার টিউটোরিয়াল

দেয়া সাইজের গ্রুপে ডাবলি লিংকড লিস্ট রিভার্স করা C++-এ

এই সমস্যায়, আমাদের একটি লিংকড লিস্টের হেড পয়েন্টার এবং একটি ইন্টিজার k দেওয়া আছে। k আকারের গ্রুপে আমাদের লিংকড লিস্টটি রিভার্স করতে হবে। উদাহরণস্বরূপ −

ইনপুট : 1 ↔ 2 ↔ 3 ↔ 4 ↔ 5 (ডাবলি লিংকড লিস্ট), k = 3
আউটপুট : 3 ↔ 2 ↔ 1 ↔ 5 ↔ 4

সমাধানের পদ্ধতি

এই সমস্যায়, আমরা একটি রিকার্সিভ অ্যালগরিদম বানাব এই সমস্যা সমাধান করার জন্য। এই পদ্ধতিতে, আমরা রিকার্সন ব্যবহার করব এবং সেটি দিয়ে সমস্যা সমাধান করব।

উদাহরণ প্রোগ্রাম

#include <iostream>
using namespace std;

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

// লিস্টে নোড পুশ করার ফাংশন
Node* push(Node* head, int data) {
    Node* new_node = new Node();
    new_node->data = data;
    new_node->next = NULL;
    Node* TMP = head;
    if (head == NULL) {
        new_node->prev = NULL;
        head = new_node;
        return head;
    }
    while (TMP->next != NULL) { // লাস্ট নোডে যাওয়া
        TMP = TMP->next;
    }
    TMP->next = new_node;
    new_node->prev = TMP;
    return head; // হেড পয়েন্টার রিটার্ন
}

// দেয়া লিস্ট প্রিন্ট করার ফাংশন
void printDLL(Node* head) {
    while (head != NULL) {
        cout << head->data << " ";
        head = head->next;
    }
    cout << endl;
}

Node* revK(Node* head, int k) {
    if (!head)
        return NULL;
    head->prev = NULL;
    Node *TMP, *CURRENT = head, *newHead;
    int count = 0;
    while (CURRENT != NULL && count < k) { // যতক্ষণ কাউন্ট k-র চেয়ে কম, সিম্পলি নোডগুলো রিভার্স করব
        newHead = CURRENT;
        TMP = CURRENT->prev;
        CURRENT->prev = CURRENT->next;
        CURRENT->next = TMP;
        CURRENT = CURRENT->prev;
        count++;
    }
    if (count >= k) {
        head->next = revK(CURRENT, k); // এখন যদি কাউন্ট k-র চেয়ে বড় বা সমান হয়, আমরা ফার্স্ট হেডকে নেক্স্ট হেডের সাথে কানেক্ট করব
    }
    return newHead;
}

int main() {
    Node* head;
    for (int i = 1; i <= 5; i++) {
        head = push(head, i);
    }
    cout << "Original List : ";
    printDLL(head);
    cout << "\nModified List : ";
    int k = 3;
    head = revK(head, k);
    printDLL(head);
}

আউটপুট

Original List : 1 2 3 4 5
Modified List : 3 2 1 5 4

উপরোক্ত কোডের ব্যাখ্যা

এই পদ্ধতিতে, আমরা লিস্ট ট্রাভার্স করছি এবং কাউন্ট k-র চেয়ে কম থাকা পর্যন্ত ট্রাভার্স করছি। আমরা একটি রিকার্সিভ কল দিচ্ছি যেটি হেড-→next-এ মান পাস করছে (এখানে আমরা সিম্পলি লিস্ট রিভার্স করছি ট্রাভার্স করার সময়, কিন্তু যখন k পৌঁছায়, আমাদের হেডকে অন্য লিস্টের kth এলিমেন্টের দিকে পয়েন্ট করতে হবে। উদাহরণস্বরূপ, যদি লিস্ট 1 2 3 4 5 হয় এবং k=3 হয়, তবে আমরা মিডেল এলিমেন্টগুলো 3 2 1 করে রিভার্স করব কিন্তু এখন আমাদের 1 কে 4-কে পয়েন্ট করতে হবে কারণ সেটিও রিভার্স হব, তাই আমরা রিকার্সিভ কল এবং এক্সট্রা if স্টেটমেন্ট ব্যবহার করছি।)

উপসংহার

এই আর্টিকেলে, আমরা রিকার্সন ব্যবহার করে দেয়া সাইজের গ্রুপে ডাবলি-লিংকড লিস্ট রিভার্স করার সমস্যা সমাধান করেছি। আমরা এই সমস্যায় C++ প্রোগ্রাম এবং সম্পূর্ণ পদ্ধতি শিখেছি। আমরা একই প্রোগ্রাম অন্যান্য ল্যাঙ্গুয়েজে লিখতে পারি যেমন C, Java, Python এবং অন্যান্য ল্যাঙ্গুয়েজ। আশা করি আপনি এই আর্টিকেলটিকে সহায়ক খুঁজে পাবেন।

  1. C++ STL-এ List reverse ফাংশন

  2. C++-এ লিংকড লিস্টের אל্টারনেট নোড প্রিন্ট করুন (রিকার্সন ছাড়া)

  3. পাইথনে লিংকড লিস্টকে k আকারের গ্রুপে উল্টে ফেলার প্রোগ্রাম

  4. পাইথনে অ্যারে গ্রুপ অনুযায়ী উল্টে ফেলার প্রোগ্রাম