2015-04-04 4 views
5

मुझे पता है कि लिंक और लीनियर लिंक्डलिस्ट क्लास कैसे बनाएं, लेकिन मैं सिर्फ अपने जीवन के लिए यह नहीं समझ सकता कि उन्हें एक परिपत्र सर्कुलरलिंकलिस्ट में कैसे संशोधित किया जाए। मैंने पहले ही इस प्रश्न का उत्तर पढ़ा है: Help with Circular Linked List in Python। हालांकि, मुझे समझ में नहीं आता कि सिर कोई नहीं है, तो किसी भी प्रकार के ऑब्जेक्ट में "अगली" विशेषता कैसे हो सकती है? मैं अवधारणा को समझने के लिए प्रतीत नहीं कर सकता। अगर किसी ने मुझे एक नमूना CircularLinkedList की init समारोह और यह कैसे काम करता है के रूप में इसे आसानी से समझा दिखा सकता है, मुझे लगता है कि मैं इसे समझने में सक्षम हो जाएगा। किसी भी और सभी मदद के लिए धन्यवादसर्कुलर लिंक्डलिस्ट कैसे बनाएं

संपादित करें: मुझे केवल आगे की ओर जाने वाली सूची की आवश्यकता है। यदि ऐसा है, तो इसके पीछे तर्क बहुत बदल जाएगा?

+0

क्या आप शून्य, एक, दो आदि तत्वों के साथ ऐसी सूची के लिए आरेख तैयार कर सकते हैं? इससे आपको चीजों को व्यवस्थित करने में मदद मिलनी चाहिए। साथ ही, खुद से पूछें कि क्या सूची में केवल एक दिशा या दूसरे में लिंक होना चाहिए। –

+0

मुझे केवल उन्हें अकेले जुड़े हुए होने की आवश्यकता है। अगर मुझे इसके पीछे की ओर जाने की ज़रूरत है तो क्या यह एक बड़ा अंतर बनाता है? –

+0

ड्राइंग के लिए, यह आसान है, लेकिन एकल-लिंक्ड सूची पर कुछ ऑपरेशन दोगुनी-लिंक्ड सूची की तुलना में अधिक जटिल हैं। –

उत्तर

5

अक्सर एक परिपत्र लिंक्ड सूची में, आपके पास एक विशेष लिंक होता है जिसमें सार्थक डेटा नहीं होता है। इसके बजाए, यह एक "सेंटीनेल" है जो आपको बताता है कि सूची की शुरुआत (और अंत) कहां है। यह लिंक तब भी मौजूद होगा जब सूची खाली हो, इसलिए आपके एल्गोरिदम विशेष सूचियों के लिए विशेष मामलों की आवश्यकता के बिना सभी सूचियों पर काम करेंगे।

class Link: 
    def __init__(self, data, next): 
     self.data = data 
     self.next = next 

class CircularLinkedList: 
    def __init__(self): 
     self.head = Link(None, None) # this is the sentinel node! 
     self.head.next = self.head # link it to itself 

    def add(self, data):    # no special case code needed for an empty list 
     self.head.next = Link(data, self.head.next) 

    def __contains__(self, data): # example algorithm, implements the "in" operator 
     current = self.head.next 
     while current != self.head: 
      if current.data == data: # element found 
       return True 
     return False 
+0

मान लीजिए कि मैं अंतिम लिंक हटा देता हूं। क्या यह स्वचालित रूप से पहले लिंक पर लूप को समायोजित करेगा, या क्या मुझे अपने डिलीट फ़ंक्शन में मैन्युअल रूप से इसके लिए खाता बनाना होगा? * इसके साथ खेलकर इसे समझ लिया। सहायता के लिए धन्यवाद! –

0

महत्वपूर्ण यहाँ कदम है कि सिर None नहीं है। केवल सिर के Link नोड का डेटा None है, और यह अपने next विशेषता के माध्यम से स्वयं को इंगित करता है। जैसा कि आपने लिंक किया है, उसमें उल्लेख किया गया है, यह इस तरह कुछ दिखाई देगा:

def __init__(self): 
    self.head = Link(None, None) 
    self.head.next = self.head 
+0

मदद के लिए धन्यवाद मुझे लगता है कि मैं इसे प्राप्त करना शुरू कर रहा हूं। धन्यवाद! –

2

दरअसल; अगर कोई नोड्स हैं, तो कोई अगले/पिछले संकेत हो सकता है:

root 
| 
v 
None 

अगर वहाँ एक नोड है, यह पीछे और आगे खुद के लिए लिंक:

root 
    | 
    v 
+-> Node <-+ 
| next---+ 
+---prev 

अगर वहाँ दो नोड्स हैं:

 root 
     | 
     v 
    +-> Node +-> Node <--+ 
    | next---+ next--+ | 
+-|---prev <-----prev | | 
| +--------------------+ | 
+------------------------+ 
+1

'नो नोड्स' के लिए आपकी स्थिति काफी ऐसी स्थिति नहीं है जो ओपी का वर्णन करती है (हालांकि यह एक संभावित दृष्टिकोण है)। इसके बजाए, यह उस स्थिति से अधिक निकटता से मिलता है जिसे आप 'एक' नोड के रूप में वर्णित करते हैं। आपका दृष्टिकोण अधिक सुविधाजनक प्रतिनिधित्व हो सकता है, हालांकि, यह आसान 'कोई नहीं' परीक्षणों की अनुमति देता है। – Joost

+0

दृश्य प्रतिनिधित्व के लिए धन्यवाद। मैं मदद की सराहना करता हूं! –

संबंधित मुद्दे