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 kodudurpublic 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.
Ve sorunuz nedir? –
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. –
@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. –