[प्रश्न संपादित करें और इस विषय के साथ स्पष्ट करने के लिए है कि हम एक दोगुना लिंक्ड सूची में चक्र के लिए जाँच कर रहे हैं, की जाँच नहीं करता है, तो एक दोगुना लिंक्ड सूची केवल परिपत्र है, इसलिए भागों reworded कर दिया गया है इस पोस्ट के अप्रासंगिक हो सकता है।]
इसके प्रत्येक नोड होने 'अगले' और 'पिछला' संकेत के साथ एक दोगुना लिंक सूची।
डबली-लिंक्ड सूचियों को सामान्य रूप से सूची के सिर और पूंछ के साथ लागू किया जाता है जो इंगित करता है कि वे कहां समाप्त होते हैं।
[संपादित करें] जैसा कि बताया गया है, यह केवल तभी जांचता है जब सूची पूरी तरह से परिपत्र है, न कि इसमें चक्र हैं, लेकिन यह मूल प्रश्न का शब्द था। यदि सूची परिपत्र है, पूंछ-> अगला == सिर और/या सिर-> पिछला == पूंछ। यदि आपके पास पूंछ और सिर नोड दोनों तक पहुंच नहीं है और केवल उनमें से एक है लेकिन दोनों नहीं, तो यह जांचने के लिए पर्याप्त होना चाहिए कि क्या सिर-> prev! = NULL या tail-> अगला! = NULL।
यदि यह पर्याप्त उत्तर नहीं है क्योंकि हमें केवल कुछ यादृच्छिक नोड दिया गया है [और सूची में कहीं भी चक्र की तलाश है], तो आपको बस इतना करना है कि यह यादृच्छिक नोड लें और सूची तक ट्रैवर्स न रखें एक नोड तक पहुंचें जो मेल खाता है (जिस स्थिति में यह परिपत्र है) या एक शून्य सूचक (जिस स्थिति में यह नहीं है)।
हालांकि, यह अनिवार्य रूप से वही बात है जैसा आपने पहले ही प्रदान किया है जिसे साक्षात्कारकर्ता पसंद नहीं आया था। मुझे पूरा यकीन है कि कुछ जादुई हैक के बिना, एक लिंक्ड सूची में एक चक्र का पता लगाने का कोई तरीका नहीं है, एक रैखिक जटिलता एल्गोरिदम के बिना एक यादृच्छिक नोड प्रदान किया जाता है।
[संपादित करें] मेरे दिमाग ने अब सूची में चक्रों का पता लगाने पर ध्यान केंद्रित किया है, यह निर्धारित करने के विरोध में कि एक लिंक्ड सूची गोलाकार है या नहीं।
हम तरह के मामले हैं: -> 2 < -> 3 < -> [2]
एक ही रास्ता मैं देख सकता हूँ कि हम चक्र का पता लगा सकते सभी तत्वों का ट्रैक रखने के लिए है हम अब तक चले गए और रास्ते में किसी भी मैच की तलाश में।
बेशक यह सस्ता हो सकता है। अगर हमें सूची नोड्स को संशोधित करने की अनुमति है, तो हम प्रत्येक नोड के साथ एक आसानी से ट्रैवर्स ध्वज रख सकते हैं जिसे हम सेट कर रहे हैं। अगर हम पहले से सेट इस झंडे के साथ एक नोड का सामना करते हैं, तो हमें एक चक्र मिला है। हालांकि, यह समांतरता के लिए अच्छा काम नहीं करेगा।
यहां प्रस्तावित एक समाधान है [जिसे मैंने दूसरे जवाब से चुरा लिया] जिसे "फ़्लॉइड साइकल-फाइंडिंग एल्गोरिदम" कहा जाता है। आइए इसे देखें (संशोधित करने के लिए इसे थोड़ा आसान बनाने के लिए संशोधित)।
function boolean hasLoop(Node startNode)
{
Node fastNode2 = startNode;
Node fastNode1 = startNode;
Node slowNode = startNode;
while (slowNode && (fastNode1 = fastNode2.next()) && (fastNode2 = fastNode1.next()))
{
if (slowNode == fastNode1 || slowNode == fastNode2)
return true;
slowNode = slowNode.next();
}
return false;
}
यह मूल रूप से 1. के बजाय 3 iterators का उपयोग करना शामिल हम तरह के मामले देख सकते हैं:> 1- 2-> 3> 4> 5> 6 -> [2] केस:
सबसे पहले हम [1] से तेज़ इटरेटर [2] और दूसरे [3] या [1, 2, 3] के साथ शुरू करते हैं। हम रुकते हैं जब पहला इटरेटर दो सेकंड इटरेटर में से किसी एक से मेल खाता है।
हम आगे बढ़ते हैं [2, 4, 5] (पहला तेज़ इटेटरेटर दूसरे फास्ट इटरेटर के अगले नोड को पार करता है, और दूसरा तेज़ इटेटरेटर उसके बाद पहले तेज इटरेटर के अगले नोड को पार करता है)। फिर [3, 6, 2], और अंत में [4, 3, 4]।
याय, हमें एक मैच मिला है, और इस प्रकार 4 पुनरावृत्तियों में एक चक्र रखने के लिए सूची निर्धारित की है।
क्या यह http://stackoverflow.com/questions/1442008/count-number-of-nodes-in-a-linked-list-that-may-be-circular – AnthonyLambert
जैसा ही है, आप मूल समाधान नहीं थे समाधान क्योंकि यदि आपने सर्कल के बाहर नोड उठाया है, तो आपका समाधान अनंत लूप करेगा। यह "इष्टतम" से बहुत दूर है। आम तौर पर एक साक्षात्कार में, यदि यह समाधान है तो एक बुरा समाधान भी स्वीकार्य है। – Codism
बदनाम रूप से एक डुप्लिकेट। – zdav