2015-01-04 11 views
5

मैंने "डेटा संरचनाओं और एल्गोरिदम" के बारे में एक पुस्तक पढ़ी जिसमें असाइनमेंट है जो मुझे एक परिपत्र लिंक्ड सूची को लागू करने के लिए कहता है। यह एक सीखने का अभ्यास है और मेरा कोड बहुत उच्च मानक का नहीं हो सकता है।जावा में सर्कुलर लिंक्ड सूची को कैसे कार्यान्वित करें?

एक परिपत्र लिंक्ड सूची के मेरे कार्यान्वयन के पीछे मुख्य विचार एक सूचक है जो अंतिम तत्व को इंगित करता है और प्रत्येक बार जब मैं नया आइटम जोड़ता हूं, तो अंतिम आइटम का 'अगला' फ़ील्ड रीफ्रेश किया जाएगा नया जोड़ा आइटम

सम्मिलन विधि ठीक काम करती है, मैं बिना किसी समस्या के आइटम जोड़ सकता हूं, लेकिन किसी कारण से मैं सूची से आइटम हटा नहीं सकता।

यहाँ 'लिंक' या 'नोड' के लिए कोड है:

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 

प्रदर्शन राशि तरह का मूर्खतापूर्ण लग रहा है, मैं तो बस अनंत लूप और मीटर से बचने के लिए करने की कोशिश की कुछ सरल है जो सिर्फ काम करता है।

+1

और आपका प्रश्न क्या है? –

+0

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

+0

@G_V 'हटाएं()' विधि जैसा कि यह हमेशा खड़ा होता है (पहले कोशिश करता है) पहले तत्व को हटा देता है, जो ठीक है क्योंकि इसका पूर्ववर्ती 'आखिरी' है। यदि आप मनमानी तत्वों को हटाना चाहते हैं, तो आपको इसे दोगुना लिंक करने की आवश्यकता होगी, लेकिन यदि आपने कभी भी 'पहले' को हटा दिया है, तो आपको इसकी आवश्यकता नहीं है। –

उत्तर

4

अपने हटाएँ() फ़ंक्शन में return temp से पहले last.next = first जोड़ें:

public Link delete() { 
    if(first.next == null) 
     last = null; 
    Link temp = first; 
    first = first.next; 
    if(last != null) 
     last.next = first 
    return temp; 
} 

अपडेट किया गया:

मैं एक परिदृश्य जो first.next == null संतुष्ट नहीं मिल रहा है, और हम को नष्ट बुला ध्यान में रखना चाहिए() एक खाली सूची पर।

public Link delete() { 
    Link temp = first; 
    if(first == null){ 
     ; // or you can throw some exception as a warning 
    } 
    else if(first==last){ // only one element 
     first = null; // reset to initial state 
     last = null; 
    } 
    else{ 
     first = first.next; 
     last.next = first; 
    } 
    return temp; 
} 
+0

आपको अपनी 'शून्य' जांच की आवश्यकता नहीं है: यदि 'पहला' शून्य नहीं है तो 'अंतिम' शून्य नहीं हो सकता है (क्योंकि यदि आपके पास अभी एक तत्व है तो पहले == अंतिम')। –

+0

@ chiastic-security जब तक first.next == शून्य सच हो सकता है, मुझे लगता है कि हमें उस शून्य जांच की आवश्यकता है क्योंकि हम अंतिम रूप से शून्य सेट करते हैं। हालांकि, मैंने देखा कि ऐसा कभी नहीं हो सकता है, इसलिए मैंने अपना जवाब अपडेट किया और एक और मामले के लिए रक्षात्मक कोड जोड़ा जिसे हम खाली सूची पर हटाते हैं। –

1

आपकी delete() विधि सूची की परिपत्र को संभालती नहीं है। अंतिम तत्व पहले तत्व को इंगित करता है; जब पहले तत्व को हटा दिया जाता है तो उसे अद्यतन करने की भी आवश्यकता होती है।

दूसरे शब्दों में, आपको first के बजाय first पर इंगित करने के लिए last.next सेट करने की आवश्यकता है।

आपके पास अन्य समस्या यह है कि यदि आप अंतिम तत्व को हटाते हैं (ताकि यह अब खाली हो), तो आपको lastnull पर सेट करने की भी आवश्यकता है।

public Link delete() { 
    if (first.next == null) { 
     first = null; 
     last = null; 
    } 
    Link temp = first; 
    first = first.next; 
    last.next = first; 
    return temp; 
} 
+0

आप संस्करण भी काम कर रहे हैं। और कम से कम मेरे लिए यह विचार स्पष्ट रूप से व्यक्त करता है। – SuperManEver

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