मैंने "डेटा संरचनाओं और एल्गोरिदम" के बारे में एक पुस्तक पढ़ी जिसमें असाइनमेंट है जो मुझे एक परिपत्र लिंक्ड सूची को लागू करने के लिए कहता है। यह एक सीखने का अभ्यास है और मेरा कोड बहुत उच्च मानक का नहीं हो सकता है।जावा में सर्कुलर लिंक्ड सूची को कैसे कार्यान्वित करें?
एक परिपत्र लिंक्ड सूची के मेरे कार्यान्वयन के पीछे मुख्य विचार एक सूचक है जो अंतिम तत्व को इंगित करता है और प्रत्येक बार जब मैं नया आइटम जोड़ता हूं, तो अंतिम आइटम का 'अगला' फ़ील्ड रीफ्रेश किया जाएगा नया जोड़ा आइटम
सम्मिलन विधि ठीक काम करती है, मैं बिना किसी समस्या के आइटम जोड़ सकता हूं, लेकिन किसी कारण से मैं सूची से आइटम हटा नहीं सकता।
यहाँ 'लिंक' या 'नोड' के लिए कोड है:
public class Link {
public long data;
public Link next;
public Link(long val) {
data = val;
next = null;
}
public void displayLink() {
System.out.print(data + " ");
}
} // end class
यह किया जाता है जो काम वर्ग के लिए कोड है, और बग स्पष्ट रूप से यहीं कहीं है:
public class CircularList {
Link first;
Link last;
public CircularList() {
first = null;
last = null;
}
public Link find(long key) {
Link current = first;
while(current.data != key) {
current = current.next;
}
return current;
} // end find
public Link delete() {
if(first.next == null)
last = null;
Link temp = first;
first = first.next;
return temp;
} // end delete
public boolean isEmpty() { return (first == null); }
public void insert(long val) {
Link newLink = new Link(val);
if(isEmpty())
last = newLink;
newLink.next = first;
first = newLink;
last.next = first;
} // end insert
public void displayAmount(int n) {
Link current = first;
while(n>0) {
current.displayLink();
current = current.next;
n--;
}
System.out.println("");
} // end displayAmount
} // end class
और मुख्य अनुप्रयोग कोड:
public class App {
public static void main(String[] args) {
CircularList cl = new CircularList();
cl.insert(10);
cl.insert(20);
cl.insert(30);
cl.insert(40);
cl.displayAmount(6);
cl.delete();
cl.displayAmount(6);
}
} // end class
प्रदर्शन राशि तरह का मूर्खतापूर्ण लग रहा है, मैं तो बस अनंत लूप और मीटर से बचने के लिए करने की कोशिश की कुछ सरल है जो सिर्फ काम करता है।
और आपका प्रश्न क्या है? –
आपकी लिंक्ड सूची नोड में पिछले नोड का संदर्भ गुम है, जिससे हटाने को असंभव बना दिया गया है। आप अंतिम तत्व को पहले के साथ-साथ अंतिम के पहले के रूप में संदर्भित करना चाहते हैं, जिसका अर्थ है कि दोनों को अगले और पिछले की आवश्यकता है। इनके साथ, आप कोई तत्व ले सकते हैं, पिछले तत्व को वर्तमान तत्व पर प्राप्त कर सकते हैं और अगले के साथ पिछले कनेक्ट कर सकते हैं, प्रभावी रूप से हटाने के लिए तत्व को काट सकते हैं। –
@G_V 'हटाएं()' विधि जैसा कि यह हमेशा खड़ा होता है (पहले कोशिश करता है) पहले तत्व को हटा देता है, जो ठीक है क्योंकि इसका पूर्ववर्ती 'आखिरी' है। यदि आप मनमानी तत्वों को हटाना चाहते हैं, तो आपको इसे दोगुना लिंक करने की आवश्यकता होगी, लेकिन यदि आपने कभी भी 'पहले' को हटा दिया है, तो आपको इसकी आवश्यकता नहीं है। –