ट्रैक
/
Python
Python
/
अभ्यास
/
सरल लिंक्ड लिस्ट
सरल लिंक्ड लिस्ट

सरल लिंक्ड लिस्ट

आसान

परिचय

आप एक संगीत स्ट्रीमिंग कंपनी के लिए काम करते हैं।

आपको अपने संगीत प्लेयर एप्लिकेशन के लिए एक प्लेलिस्ट फीचर बनाने का काम सौंपा गया है।

निर्देश

म्यूज़िक प्लेयर एप्लिकेशन का एक प्रोटोटाइप लिखिए।

प्रोटोटाइप के लिए, हर गाने को बस एक संख्या से दर्शाया जाएगा। संख्याओं की एक रेंज (यानी गानों की आईडी) दी गई हो, तो एक सिंगली लिंक्ड लिस्ट बनाइए।

एक सिंगली लिंक्ड लिस्ट दी गई हो, तो आपको उस लिस्ट को उलटकर गाने उल्टे क्रम में चला पाना चाहिए।

Note

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

सबसे सरल तरह की लिंक्ड लिस्ट सिंगली लिंक्ड लिस्ट होती है। इसका मतलब है कि हर एलिमेंट (या "नोड") में डेटा होता है, और साथ में वह चीज़ भी होती है जो लिस्ट के अगले नोड की ओर इशारा करती है।

अगर आप लिंक्ड लिस्ट के बारे में और गहराई में जाना चाहते हैं, तो यह लेख देखिए, जिसमें अच्छे चित्रों की मदद से इसे समझाया गया है।

Python में इस अभ्यास का ढाँचा

stacks और queues को lists, collections.deque, queue.LifoQueue और multiprocessing.Queue की मदद से बनाया जा सकता है, लेकिन इस अभ्यास में एक "लास्ट इन, फर्स्ट आउट" (LIFO) स्टैक चाहिए, जो खुद बनाई गई सिंगली लिंक्ड लिस्ट पर आधारित हो:


लिंक्ड लिस्ट से बनाए गए स्टैक को दिखाने वाला चित्र। सबसे बाईं ओर New_Node नाम का एक बिंदुदार किनारे वाला वृत्त है, जिससे दो बिंदुदार तीर रेखाएँ दाईं ओर इशारा करती हैं। New_Node पर लिखा है "(becomes head) - New_Node - next = node_6"। ऊपर वाली बिंदुदार तीर रेखा पर "push" लिखा है और वह ऊपर-दाईं ओर Node_6 की ओर इशारा करती है। Node_6 पर लिखा है "(current) head - Node_6 - next = node_5"। नीचे वाली बिंदुदार तीर रेखा पर "pop" लिखा है और वह एक डिब्बे की ओर इशारा करती है जिस पर लिखा है "gets removed on pop()"। Node_6 से एक ठोस तीर दाईं ओर Node_5 की ओर जाता है, जिस पर लिखा है "Node_5 - next = node_4"। Node_5 से एक ठोस तीर दाईं ओर Node_4 की ओर जाता है, जिस पर लिखा है "Node_4 - next = node_3"। यही क्रम Node_1 तक चलता है, जिस पर लिखा है "(current) tail - Node_1 - next = None"। Node_1 से एक बिंदुदार तीर दाईं ओर एक नोड की ओर जाता है जिस पर लिखा है "None"।


इसे उस LIFO स्टैक जो डायनामिक ऐरे या लिस्ट पर बनाया जाता है से नहीं मिलाना चाहिए; ऐसे स्टैक के अंदर list, queue या array इस्तेमाल हो सकते हैं। डायनामिक ऐरे पर आधारित stacks में head की जगह अलग होती है, और समय जटिलता (Big-O) तथा मेमोरी की खपत भी अलग होती है।


ऐरे/डायनामिक ऐरे से बनाए गए स्टैक को दिखाने वाला चित्र। सबसे दाईं ओर New_Node नाम का एक बिंदुदार किनारे वाला डिब्बा है, जिससे दो बिंदुदार तीर रेखाएँ बाईं ओर इशारा करती हैं। New_Node पर लिखा है "(becomes head) -  New_Node"। ऊपर वाली बिंदुदार तीर रेखा पर "append" लिखा है और वह ऊपर-बाईं ओर Node_6 की ओर इशारा करती है। Node_6 पर लिखा है "(current) head - Node_6"। नीचे वाली बिंदुदार तीर रेखा पर "pop" लिखा है और वह एक बिंदुदार डिब्बे की ओर इशारा करती है जिस पर लिखा है "gets removed on pop()"। Node_6 से एक ठोस तीर बाईं ओर Node_5 की ओर जाता है। Node_5 से एक ठोस तीर बाईं ओर Node_4 की ओर जाता है। यही क्रम Node_1 तक चलता है, जिस पर लिखा है "(current) tail - Node_1"।


कुछ बातों पर ध्यान देने के लिए Stack Overflow के ये दो सवाल देखिए: ऐरे पर आधारित बनाम लिस्ट पर आधारित स्टैक और क्यू और ऐरे स्टैक, लिंक्ड स्टैक और स्टैक में क्या अंतर है। लिंक्ड लिस्ट, LIFO स्टैक और Python में दूसरे एब्सट्रैक्ट डेटा टाइप (ADT) के बारे में अधिक जानकारी के लिए:


Python में क्लास

Python में लिंक्ड लिस्ट बनाने का "मानक" तरीका आमतौर पर एक या अधिक classes चाहता है। classes की अच्छी शुरुआत के लिए classes और उसके साथ वाला अभ्यास ellens-alien-game देखिए, या ऑफिशियल Python ट्यूटोरियल का क्लास वाला हिस्सा देखिए।


Python में स्पेशल मेथड

इस अभ्यास के टेस्ट आपकी LinkedList पर len() कॉल करेंगे। len() के काम करने के लिए आपको एक __len__ स्पेशल मेथड बनाना होगा। Python में स्पेशल या "डंडर" मेथड लागू करने का ब्यौरा Python डॉक्स: बेसिक ऑब्जेक्ट कस्टमाइज़ेशन और Python डॉक्स: object.len(self) में देखिए।


इटरेटर बनाना

अपनी LinkedList पर लूप चलाने या उसे उलटने के लिए आपको __iter__ स्पेशल मेथड लागू करना होगा। इसे लागू करने का तरीका किसी क्लास के लिए इटरेटर लागू करना में देखिए।


एक्सेप्शन कस्टमाइज़ करना और उन्हें उठाना

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

कस्टम एक्सेप्शन नई एक्सेप्शन क्लास बनाकर बनाए जा सकते हैं (अधिक जानकारी के लिए classes देखिए), जो आमतौर पर Exception की सबक्लास होती हैं।

जहाँ आपको पता हो कि एरर की जड़ किसी खास एक्सेप्शन टाइप से निकली है, वहाँ आप Exception क्लास के अंदर दिए गए built in error types में से किसी एक को इनहेरिट कर सकते हैं। एरर उठाते समय भी आपको अर्थपूर्ण मैसेज देना चाहिए।

इस अभ्यास में आपको एक कस्टम एक्सेप्शन बनाना है, जिसे आपकी लिंक्ड लिस्ट के खाली होने पर उठाना यानी "थ्रो" करना है। टेस्ट तभी पास होंगे जब आप उचित एक्सेप्शन कस्टमाइज़ करेंगे, उन्हें raise करेंगे और उचित एरर मैसेज देंगे।

किसी सामान्य एक्सेप्शन को कस्टमाइज़ करने के लिए ऐसी class बनाइए जो Exception से इनहेरिट करे। कस्टम एक्सेप्शन को किसी मैसेज के साथ उठाते समय मैसेज को exception टाइप का आर्गुमेंट बनाकर लिखिए:

# subclassing Exception to create EmptyListException
class EmptyListException(Exception):
    """Exception raised when the linked list is empty.

    message: explanation of the error.

    """
    def __init__(self, message):
        self.message = message

# raising an EmptyListException
raise EmptyListException("The list is empty.")
GitHub के ज़रिए संपादित करें यह लिंक एक नई विंडो या टैब में खुलता है
Python Exercism

सरल लिंक्ड लिस्ट शुरू करने के लिए तैयार हैं?

Exercism पर साइन अप कीजिए और Python को 17 कॉन्सेप्ट146 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।