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

C++ দিয়ে লিঙ্কড লিস্টকে একটি মানের চারপাশে পার্টিশন করা যাতে অর্ডার বাঁচে

এই টিউটোরিয়ালে একটি লিঙ্কড লিস্ট দেওয়া আছে। আমাদের x থেকে ছোট সব সংখ্যা লিস্টের শুরুতে এবং বাকিগুলো পেছনে রাখতে হবে। সাথে সাথে তাদের আসল অর্ডার (original order) বজায় রাখতে হবে। উদাহরণ −

ইনপুট: 1→4→3→2→5→2→3, x = 3 আউটপুট: 1→2→2→3→3→4→5
ইনপুট: 1→4→2→10, x = 3 আউটপুট: 1→2→4→10
ইনপুট: 10→4→20→10→3, x = 3 আউটপুট: 3→10→4→20→10

এই সমস্যা সমাধানের জন্য আমাদের তিনটি লিঙ্কড লিস্ট বানাতে হবে। যখন আমরা x থেকে ছোট মান পাব, তখন প্রথম লিস্টে ইনসার্ট করব। x-এর সমান হলে দ্বিতীয় লিস্টে, এবং বড় হলে তৃতীয় লিস্টে। শেষে তিনটি লিস্ট কনক্যাটেনেট (concatenate) করে ফাইনাল লিস্ট প্রিন্ট করব।

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

এই পদ্ধতিতে, আমরা তিনটি লিস্ট মেইনটেইন করব: small, equal, large। তাদের অর্ডার বজায় রেখে কনক্যাটেনেট করব একটি ফাইনাল লিস্টে, যা আমাদের উত্তর।

উদাহরণ

উপরোক্ত পদ্ধতির C++ কোড

 #include<bits/stdc++.h> using namespace std; struct Node{ // নোড স্ট্রাকচার     int data;     struct Node* next; }; // নতুন নোড বানाने ইউটিলিটি ফাংশন Node *newNode(int data){     struct Node* new_node = new Node;     new_node->data = data;     new_node->next = NULL;     return new_node; } struct Node *partition(struct Node *head, int x){     struct Node *smallhead = NULL, *smalllast = NULL; // ছোট লিস্টের হেড ও লাস্ট     struct Node *largelast = NULL, *largehead = NULL; // বড় লিস্টের হেড ও লাস্ট     struct Node *equalhead = NULL, *equallast = NULL; // সমান লিস্টের হেড ও লাস্ট     while (head != NULL){ // মূল লিস্ট ট্রাভার্স         if (head->data == x){ // x-এর সমান             if (equalhead == NULL) equalhead = equallast = head;             else { equallast->next = head; equallast = equallast->next; }         }         else if (head->data < x){ // x-এর ছোট             if (smallhead == NULL) smalllast = smallhead = head;             else { smalllast->next = head; smalllast = head; }         }         else { // x-এর বড়             if (largehead == NULL) largelast = largehead = head;             else { largelast->next = head; largelast = head; }         }         head = head->next;     }     if (largelast != NULL) largelast->next = NULL; // লাস্ট লিস্টের লাস্ট NULL     /**********লিস্টগুলো কনক্যাটেনেট করা**********/     if (smallhead == NULL){         if (equalhead == NULL) return largehead;         equallast->next = largehead; return equalhead;     }     if (equalhead == NULL){         smalllast->next = largehead; return smallhead;     }     smalllast->next = equalhead; equallast->next = largehead; return smallhead; } void printList(struct Node *head){ // লিস্ট প্রিন্ট ফাংশন     struct Node *temp = head;     while (temp != NULL){ printf("%d ", temp->data); temp = temp->next; } } int main(){     struct Node* head = newNode(10);     head->next = newNode(4);     head->next->next = newNode(5);     head->next->next->next = newNode(30);     head->next->next->next->next = newNode(2);     head->next->next->next->next->next = newNode(50);     int x = 3;     head = partition(head, x);     printList(head);     return 0; }
আউটপুট
2 10 4 5 30
কোডের ব্যাখ্যা

উপরোক্ত পদ্ধতিতে, আমরা তিনটি লিঙ্কড লিস্ট মেইনটেইন করি যেগুলো ক্রমবদ্ধভাবে x-এর ছোট, সমান, এবং বড় এলিমেন্ট ধারণ করে। এখন কাজ সহজ: লিস্টগুলো কনক্যাটেনেট করে হেড রিটার্ন করি।

উপসংহার

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

  1. C++-এ সর্টেড ডাবলি লিংকড লিস্টে যেসব ট্রিপলেটের যোগফল x সেটির সংখ্যা গণনা

  2. C++-এ সর্টেড ডাবলি লিংকড লিস্টে যেসব ট্রিপলেটের গুণফল x সেটির সংখ্যা গণনা

  3. C++-তে লিংকড লিস্ট থেকে K দিয়ে বিভাজ্য সর্বোচ্চ ও ন্যূনতম এলিমেন্ট বের করা

  4. সি++-এ সার্কুলার লিংকড লিস্টের নোডগুলোর যোগফল (Sum)