Java'da Bağlantılı Liste Veri Yapısını nasıl oluştururum? [kapalı]


135

Java ile bağlantılı bir liste yapmanın en iyi yolu nedir?


33
Bağlantılı bir liste yapmanın en iyi yolu yerleşik bağlantılı listeyi kullanmaktır. Yerleşik sınıfları yeniden yazma.
Peter Lawrey

21
Bu soru programcıların tartışması için meşru ve çok yapıcı
anshulkatta

Yanıtlar:


220

Java'ya aşina olan geliştiricilere açık çözüm , java.util dosyasında önceden sağlanan LinkedList sınıfını kullanmaktır . Ancak, bir nedenden dolayı kendi uygulamanızı yapmak istediğinizi varsayalım. İşte listenin başına yeni bir bağlantı ekleyen, listenin başından silen ve içindeki bağlantıları yazdırmak için listede dolaşan bağlı bir listeye hızlı bir örnek. Donanım bu uygulamaya bunu bir hale getirilmesi de yer çift bağlantılı liste için yöntemleri ekleyerek, insert ve silmek ve ekleyerek ortadan veya ucundan olsun ve sıralama sıra yöntemleri.

Not : Örnekte, Link nesnesi aslında başka bir Link nesnesi içermez - nextLink aslında sadece başka bir bağlantıya bir referanstır.

class Link {
    public int data1;
    public double data2;
    public Link nextLink;

    //Link constructor
    public Link(int d1, double d2) {
        data1 = d1;
        data2 = d2;
    }

    //Print Link data
    public void printLink() {
        System.out.print("{" + data1 + ", " + data2 + "} ");
    }
}

class LinkList {
    private Link first;

    //LinkList constructor
    public LinkList() {
        first = null;
    }

    //Returns true if list is empty
    public boolean isEmpty() {
        return first == null;
    }

    //Inserts a new Link at the first of the list
    public void insert(int d1, double d2) {
        Link link = new Link(d1, d2);
        link.nextLink = first;
        first = link;
    }

    //Deletes the link at the first of the list
    public Link delete() {
        Link temp = first;
        if(first == null){
         return null;
         //throw new NoSuchElementException(); // this is the better way. 
        }
        first = first.nextLink;
        return temp;
    }

    //Prints list data
    public void printList() {
        Link currentLink = first;
        System.out.print("List: ");
        while(currentLink != null) {
            currentLink.printLink();
            currentLink = currentLink.nextLink;
        }
        System.out.println("");
    }
}  

class LinkListTest {
    public static void main(String[] args) {
        LinkList list = new LinkList();

        list.insert(1, 1.01);
        list.insert(2, 2.02);
        list.insert(3, 3.03);
        list.insert(4, 4.04);
        list.insert(5, 5.05);

        list.printList();

        while(!list.isEmpty()) {
            Link deletedLink = list.delete();
            System.out.print("deleted: ");
            deletedLink.printLink();
            System.out.println("");
        }
        list.printList();
    }
}

7
Ayrıca int ve double'ları depolamak yerine veri türü için jenerikler kullanmak üzere bu kodu kolayca geliştirebilirsiniz.
shsteimer

51
@ shsteimer: kesinlikle, ama bu kodun tek iyi kullanımı tekniği göstermek olduğundan, kimseye yardımcı olmaz. Sadece temel fikri dağıtırdı.
Joachim Sauer

8
İyi OO olması yaklaşım değildir public Link nextLinkve sınıf dışında üzerinde çalışan. Ne zaman Linkiç sınıf olacaktı LinkList. Java'nın yalnızca başka bir c sürümü olduğu için yazılan bir başka kod grubudur.
Bart

1
Eklediğinizde, ilk öğeniz asla bir sonraki bağlantıya sahip olmaz - Java referanslarıyla ilgili bir şey eksik olmadıkça
Chris S

Delete (index) yöntemini nasıl uygulayabilirim?
JohnDow

55

Java'nın, kontrol etmek isteyebileceğiniz bir LinkedList uygulaması vardır . JDK ve kaynaklarını java.sun.com adresinden indirebilirsiniz .


Java'nın Linkedlist öğesi, rastgele konumlara öğe eklemenize ve kaldırmanıza izin vermiyor mu?
Seun Osewa

10
Bağlantılı bir listenin amacı bu değil mi?
jrockway

2
@Eseoew keyfi bir konumda eklemek istiyorsanız pls bir ArrayList kullanın :)
headgrowe

3
Yerine uygulanmasını görmek için JDK indirmek LinkedList, sadece olabilir bakışıdır LinkedList.javaçevrimiçi burada . Bu sayfa sözdizimini bile vurgulamaktadır ve Javadoc yorumlarını satır içinde yapar.
Rory O'Kane


17

Yukarıdaki bağlantılı liste ters yönde görüntülenir. Bence ekleme yönteminin doğru uygulanması

public void insert(int d1, double d2) { 
    Link link = new Link(d1, d2); 

    if(first==null){
        link.nextLink = null;
        first = link; 
        last=link;
    }
    else{
        last.nextLink=link;
        link.nextLink=null;
        last=link;
    }
} 

1
Aksi belirtilmedikçe sonuna kadar yeni ekleyin. :-)

9

Java.util.LinkedList'i kullanmak çok daha iyi, çünkü yazacağınızdan muhtemelen çok daha optimize edilmiş.


15
Ve ilk kez çalışacak.
Peter Lawrey

7
//slightly improved code without using collection framework

package com.test;

public class TestClass {

    private static Link last;
    private static Link first;

    public static void main(String[] args) {

        //Inserting
        for(int i=0;i<5;i++){
            Link.insert(i+5);
        }
        Link.printList();

        //Deleting
        Link.deletefromFirst();
        Link.printList();
    }


    protected  static class Link {
        private int data;
        private Link nextlink;

        public Link(int d1) {
            this.data = d1;
        }

        public static void insert(int d1) {
            Link a = new Link(d1);
            a.nextlink = null;
            if (first != null) {
                last.nextlink = a;
                last = a;
            } else {
                first = a;
                last = a;
            }
            System.out.println("Inserted -:"+d1);
        }

        public static void deletefromFirst() {
            if(null!=first)
            {
                System.out.println("Deleting -:"+first.data);
                first = first.nextlink;
            }
            else{
                System.out.println("No elements in Linked List");
            }
        }

        public static void printList() {
            System.out.println("Elements in the list are");
            System.out.println("-------------------------");
            Link temp = first;
            while (temp != null) {
                System.out.println(temp.data);
                temp = temp.nextlink;
            }
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.