2015-01-04 26 views
5

Dairesel bağlantılı bir listeyi uygulamamı isteyen görevlerin bulunduğu "Veri yapıları ve algoritmaları" hakkında bir kitap okurum. Bu bir öğrenme alıştırmasıdır ve kodum çok yüksek bir standart olmayabilir.Java'da dairesel bağlantılı liste nasıl uygulanır?

Dairesel bağlantılı bir listenin uygulanmasının arkasındaki ana fikir, son öğeyi işaret eden bir işaretçiye sahip olmak ve her yeni öğeyi eklediğimde, son öğenin "sonraki" alanı, işaret edecek şekilde yenilenecek yeni eklenen öğe.

Ekleme yöntemi düzgün çalışıyor, herhangi bir sorun olmadan ürün ekleyebilirim, ancak bazı nedenler listeden öğeleri silemiyorum. İşte

'Bağlantı' ya da 'Düğüm' kodudur: Bu işi yürütmektedir sınıfın kodudur

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 

ve hata buralarda bir yerde besbelli:

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 

ve ana uygulama kodu: ekran miktarı biraz saçma görünüyor

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 

, sadece sonsuz döngü ve m uzak durmaya Sadece işe yarayan basit bir şey.

+1

Ve sorunuz nedir? –

+0

Bağlantılı liste düğümünüz, önceki düğüme bir başvuru eksik, bu da kaldırmayı imkansız kılıyor. Son elementin, hem ilk hem de birinciye atıfta bulunmasını istersiniz; Bunlarla, herhangi bir eleman alabilir, önceki öğeyi önceki ve bir sonraki öğeye alabilir ve bir öncekiyle daha sonra bağlantı kurabilir, silecek öğeyi etkin bir şekilde kesebilirsiniz. –

+0

@G_V 'delete()' yöntemini her zaman olduğu gibi (her defasında) ilk öğeyi silecektir, bu da selefinin sonuncusudur. Rasgele öğeleri silmek istediğinizde, iki kez bağlanmanız gerekecek, ancak sadece "ilk" kelimesini silerseniz, buna ihtiyacınız olmaz. –

cevap

4

Silme() fonksiyonunda return temp önce last.next = first ekleyin:

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

Güncel:

Ben first.next == null tatmin bir senaryo bulamıyorum ve biz silmek çağıran dikkate almalıdır() boş bir listede.

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

'null' kontrolüne ihtiyacınız yok: eğer' first' null değilse, 'last' null olamaz (çünkü eğer bir elemente sahipseniz, o zaman' first == last'). –

+0

@ chiastic-security İlk .next == null doğru olduğu sürece, null olarak belirlediğimiz null çeke ihtiyacımız var. Ancak, bunun asla gerçekleşmeyeceğini fark ettim, bu yüzden cevabımı güncelledim ve boş bir listede sildiğimiz başka bir durum için savunma kodunu ekledim. –

1

delete() yönteminiz, listenin yuvarlaklığını taşımaz. Son eleman ilk elemana işaret eder; Ayrıca, ilk öğe silindiğinde güncellenmesi gerekir.

Diğer bir deyişle, değerini, eski first yerine yeni first işaret edecek şekilde ayarlamanız gerekir.

Elinizdeki diğer konu, son öğeyi (yani şimdi boş) silerseniz, last değerini null olarak ayarlamanız gerektiğidir.

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

siz de varyant çalışıyor. Ve en azından benim için fikri açık bir şekilde iletiyor. – SuperManEver

İlgili konular