ট্র্যাক
/
Python
Python
/
অনুশীলনী
/
লিংকড লিস্ট
লিংকড লিস্ট

লিংকড লিস্ট

মধ্যম

ভূমিকা

আপনি একটি ব্যস্ত রেলওয়ে নেটওয়ার্কের জন্য ট্রেন শিডিউলিং সিস্টেম তৈরির একটি প্রকল্পে কাজ করছেন।

শিডিউলিং সিস্টেমের ট্রেন রুটগুলোর একটি প্রোটোটাইপ তৈরি করতে আপনাকে বলা হয়েছে। প্রতিটি রুট হলো ট্রেন স্টেশনগুলোর একটি ক্রম, যেখানে কোনো একটি নির্দিষ্ট ট্রেন থামে।

নির্দেশনা

আপনার দল সিদ্ধান্ত নিয়েছে যে সময়সূচির প্রতিটি ট্রেন রুট উপস্থাপন করতে একটি ডাবলি লিংকড লিস্ট ব্যবহার করা হবে। ট্রেনের রুটের প্রতিটি স্টেশন লিংকড লিস্টের একটি নোড দিয়ে উপস্থাপন করা হবে।

স্টেশনগুলোতে আগমন ও প্রস্থানের সময় নিয়ে আপনার চিন্তা করতে হবে না। প্রতিটি স্টেশন শুধু একটি সংখ্যা দিয়ে উপস্থাপন করা হবে।

রুটগুলো সম্প্রসারিত করা যায়, রুটের শুরুতে বা শেষে স্টেশন যোগ করে। রুটের শুরু বা শেষ থেকে স্টেশন সরিয়ে এগুলো ছোটও করা যায়।

কখনো কখনো কোনো স্টেশন বন্ধ হয়ে যায়, আর সেক্ষেত্রে স্টেশনটি রুট থেকে সরিয়ে ফেলতে হয়, এমনকি সেটি রুটের শুরুতে বা শেষে না থাকলেও।

একটি রুটের আকার মাপা হয় ট্রেনটি কত দূর চলে তা দিয়ে নয়, বরং এটি কতগুলো স্টেশনে থামে তা দিয়ে।

Note

লিংকড লিস্ট হলো কম্পিউটার সায়েন্সের একটি মৌলিক ডেটা স্ট্রাকচার, যা প্রায়ই অন্য ডেটা স্ট্রাকচার তৈরি করতে ব্যবহৃত হয়। নাম থেকেই বোঝা যায়, এটি এমন একটি লিস্ট যার নোডগুলো পরস্পর সংযুক্ত। এটি "নোড"-এর একটি লিস্ট, যেখানে প্রতিটি নোড তার প্রতিবেশী বা প্রতিবেশীদের সাথে সংযুক্ত থাকে। একটি সিঙ্গলি লিংকড লিস্ট-এ প্রতিটি নোড কেবল তার পরে আসা নোডের সাথে সংযুক্ত থাকে। একটি ডাবলি লিংকড লিস্ট-এ প্রতিটি নোড তার আগে আসা নোড এবং পরে আসা নোড, উভয়ের সাথেই সংযুক্ত থাকে।

লিংকড লিস্ট সম্পর্কে আরও গভীরে যেতে চাইলে, সুন্দর কিছু ছবি দিয়ে এটি ব্যাখ্যা করা এই নিবন্ধটি দেখুন।

Python-এ এই অনুশীলনীটি কীভাবে সাজানো আছে

লিংকড লিস্ট বিভিন্ন রকম অন্তর্নিহিত ডেটা স্ট্রাকচার দিয়ে বিভিন্নভাবে ইমপ্লিমেন্ট করা যায়, তবে এখানে আমরা চাই আপনি আপনার লিংকড লিস্টটি OOP ধাঁচে ইমপ্লিমেন্ট করুন।

স্টাব ফাইলে আপনি একটি Node ক্লাসের শুরু দেখতে পাবেন, সেই সঙ্গে একটি LinkedList ক্লাসও। আপনার Node ক্লাসকে তার মান ট্র্যাক করতে হবে, সেই সঙ্গে কোন নোডগুলো তার আগে বা পরে থাকে তাও। আপনার push, pop, shift, unshift, আর len-এর জন্য বিশেষ মেথডটি LinkedList ক্লাসে ইমপ্লিমেন্ট করতে হবে। ইটারেশনের জন্য একটি বিশেষ iter মেথড ইমপ্লিমেন্ট করাও আপনার কাজে লাগতে পারে।

মূল অনুশীলনীর থেকে আলাদা, আমরা খালি LinkedLists-এর উপর pop এবং shift কল করে এরর পরিস্থিতি পরীক্ষা করব, তাই আপনাকে যথাযথভাবে এরর raise করতে হবে।

সবশেষে, উপরে বর্ণিত মেথডগুলোর পাশাপাশি আমরা চাই আপনি delete ইমপ্লিমেন্ট করুন। delete একটি আর্গুমেন্ট নেবে, যেটি হলো লিংকড লিস্ট থেকে যে মানটি সরাতে হবে তা। মানটি যদি একবারের বেশি থাকে, তবে কেবল প্রথম উপস্থিতিটি সরানো উচিত।


এক্সেপশন মেসেজ

কখনও কখনও এক্সেপশন raise করা প্রয়োজন হয়। এটি করার সময়, এররটির উৎস কী তা বোঝাতে আপনার সর্বদা একটি অর্থবহ এরর মেসেজ যোগ করা উচিত। এতে আপনার কোড আরও পাঠযোগ্য হয় এবং ডিবাগিং করতে যথেষ্ট সাহায্য করে। এমন পরিস্থিতির জন্য যেখানে আপনি জানেন এররের উৎসটি নির্দিষ্ট কোনো টাইপ হবে, আপনি বিল্ট-ইন এরর টাইপগুলোর একটি raise করা বেছে নিতে পারেন, তবে তবুও একটি অর্থবহ মেসেজ যোগ করা উচিত।

এই নির্দিষ্ট অনুশীলনীতে প্রয়োজন, delete() করা একটি নোড মান লিংকড লিস্টে পাওয়া না গেলে একটি ValueError "থ্রো" করতে আপনি raise স্টেটমেন্টটি ব্যবহার করুন। এর পাশাপাশি, pop() করার জন্য কোনো নোড বাকি না থাকলে একটি IndexError থ্রো করা উচিত। আপনি যদি এই exceptions-গুলো raise করেন এবং সেগুলোর সঙ্গে মেসেজও দেন, তবেই টেস্টগুলো পাস করবে।

মেসেজসহ একটি ValueError raise করতে, মেসেজটি exception টাইপে একটি আর্গুমেন্ট হিসেবে লিখুন:

# When the value passed to `delete()` is not found.
if not found:
    raise ValueError("Value not found")

মেসেজসহ একটি IndexError raise করতে, মেসেজটি exception টাইপে একটি আর্গুমেন্ট হিসেবে লিখুন:

# When pop() is called and there are no nodes left in the linked list
if self.length == 0:
    raise IndexError("List is empty")

Python-এ বিশেষ মেথড

এই অনুশীলনীর টেস্টগুলো আপনার LinkedList-এর উপর len()-ও কল করবে। len() কাজ করার জন্য আপনাকে একটি __len__ বিশেষ মেথড তৈরি করতে হবে। Python-এ বিশেষ বা "dunder" মেথড ইমপ্লিমেন্ট করার বিস্তারিত জানতে দেখুন Python Docs: বেসিক অবজেক্ট কাস্টমাইজেশন এবং Python Docs: object.len(self)।

আমরা আরও সুপারিশ করি যে আপনার লিংকড লিস্টের উপর ইটারেশন করতে সাহায্য করবে এমন একটি বিশেষ __iter__ মেথড তৈরি করুন।



সূত্র

কম্পিউটার সায়েন্সের একটি চিরায়ত বিষয়
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
Python Exercism

লিংকড লিস্ট শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, Python ট্র্যাকের 17টি কনসেপ্ট146টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।