आप शायद एक दोगुनी-लिंक्ड सूची का मतलब है, एक पॉइंटर्स आगे बढ़ रहे हैं और दूसरा पिछड़ा जा रहा है। यह आपको दिए गए नोड के लिए अगले और पिछले नोड्स को अंतिम या दो नोड्स को याद किए बिना (एकल-लिंक्ड सूची में) याद रखने की अनुमति देता है।
लेकिन एक चीज जिसने मुझे खोजा, जिसने कोड भी बनाया और सुरुचिपूर्ण हमेशा सूची में दो और धूल तत्वों को हमेशा, आखिरी और आखिरी बार रखना था। यह प्रविष्टि और हटाने के लिए किनारे के मामलों से छुटकारा पाता है क्योंकि आप हमेशा सूची के मध्य में नोड पर कार्य करते हैं।
उदाहरण के लिए, एक खाली सूची बनाई गई है:
first = new node
last = new node
first.next = last
first.prev = null
last.next = null
last.prev = first
// null <- first <-> last -> null
जाहिर है, सूची traversing थोड़ा संशोधित किया जाता है (आगे संस्करण केवल दिखाया गया है):
curr = first.next
while curr <> last:
do something with curr
curr = curr.next
सम्मिलन आप के बाद से डॉन अधिक सरल होती हैं सूची के आरंभ या अंत में आप डालने के साथ खुद को चिंता करने की ज़रूरत नहीं है। वर्तमान बिंदु से पहले सम्मिलित करने के लिए:
if curr = first:
raise error
add = new node
add.next = curr
add.prev = curr.prev
curr.prev.next = add
curr.prev = add
विलोपन, यह भी सरल हैं किनारे मामलों से परहेज:
if curr = first or curr = last:
raise error
curr.prev.next = curr.next
curr.next.prev = curr.prev
delete curr
सभी बहुत अधिक स्वच्छ कोड और केवल सूची के अनुसार दो अतिरिक्त नोड्स बनाए रखने के लिए होने की कीमत पर , आज के विशाल स्मृति अंतरिक्ष वातावरण में एक बड़ा बोझ नहीं है।
चेतावनी 1: यदि आप एम्बेडेड प्रोग्रामिंग कर रहे हैं जहां अंतरिक्ष अभी भी महत्वपूर्ण हो सकता है, तो यह एक व्यवहार्य समाधान नहीं हो सकता है (हालांकि कुछ एम्बेडेड वातावरण इन दिनों भी बहुत गड़बड़ हैं)।
चेतावनी 2: यदि आप ऐसी भाषा का उपयोग कर रहे हैं जो पहले से ही लिंक्ड सूची क्षमताओं को प्रदान करता है, तो शायद यह स्वयं को रोल करने के बजाय बेहतर है (बहुत विशिष्ट परिस्थितियों के अलावा)।
सी ++ में आपको 'std :: list' और iterators का उपयोग करना चाहिए। और याद रखें: 'सूची' एक अंतिम-रिसॉर्ट कंटेनर है। – GManNickG
"डबल पॉइंटर" से आपका क्या मतलब है? – fingerprint211b
एक ** नोड - पॉइंटर को एक नोड में पॉइंटर। –