এই টিউটোরিয়ালে একটি লিঙ্কড লিস্ট দেওয়া আছে। আমাদের 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 ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।