Linked List (Java)

LINKED LISTS (BAĞLI LİSTELER)

Linked List konusuna geçmeden önce arraylistler hakkında hemen küçük bir hatırlatma yapalım.

ArrayList<String> diller = new ArrayList<String>(); // şeklinde tanımlayıp.

diller.add(“Python”); // şeklinde de ekleme yapabiliyorduk.

for (String s: diller) sout (s);   // şeklinde bastırabiliyorduk.

Örneğin arraylistimizin 1. indisine bir değer eklememiz gerektiğinde ekleyeceksek diller.add (1,”c++”); şeklinde ekleyebiliyoruz. Bu sırada Java arka planda hafızada 1 yer açıyor ve indislerin hepsini aşağı kaydırıyor ve c++ string değerini 1. indise ekliyor. Bu da çok maliyetli bir işlem olduğu için (1 milyon data olduğunu düşünün) linked list kullanmak daha az maliyetli bir çözüm olarak karşımıza çıkıyor. Genellikle ArrayList’ler ile LinkedList’ler karşılaştırılırken bu husus göz önünde bulundurulur.

Linked Listlerde C dilinde pointer kullanırken Java’da da her düğümün referansları diğer düğümleri gösterecektir. Referansları pointerler gibi düşünebiliriz. 1 milyon adet değer olsa bile , 1 tane şeyin yerini değiştireceksek yalnızca basit bir yer değiştirme ile birlikte halledebiliyoruz.

Eğer silme işlemi uygulayacaksak da aynı C’deki gibi silinecek elemandan önce olan elemanın referansını, silinecek elemandan sonraki elemana bağlarız.

Linked Listlerin dezavantajı da bir objenin hem referansı hem de değerini taşıdığı için Linked List bellekte fazla bir yer kaplayabilir. Böyle durumlarda ise Arraylistler tercih ediliyor.

Linkedlist<String> gidilecek_yerler = new LinkedList<String>(); // şeklinde tanımlıyoruz.

gidilecek_yerler.add(“okul”); // şeklinde ekleme yapıyoruz.

for(String s: gidilecek_yerler) sout(s); // şeklinde bastırabiliriz.

Linked List’in üzerinde gezinebilmek için iterator adında bir referans tanımlıyoruz. Tıpkı C’de ilk elemandan sonra listenin üzerinde gezinebildiğimiz gibi burada da aynı işlemi yapacağız.

ListIterator <String> iterator = gidilecek_yerler.listIterator();

while(iterator.hasNext() sout(iterator.next()); // şeklinde kolay bir şekilde bastırabiliyoruz.

gidilecek_yerler.remove(3); dediğimiz zaman 3. indexi direk siliyoruz

public static void sirali_ekle(LinkedList<String>)gidilecek_yerler, String yeni)

while iterator.hasNext(){

int karsilastir = iterator.next().compareTo(yeni);

if(karsilastir == 0){

// iki deger eşit

sout listede bu eleman zaten var

return ; // metodu sonlandırmak için kullanıyoruz.

}

else if (karsilastir < 0) {

// yeni deger iterator.next ten daha büyük

}

else if (karsilastir > 0){

iterator.previous();

iterator.add(yeni);

return;

}

}

iterator.add(yeni);

sirali_ekle(gidilecek_yerler,”ev”); v.b v.b

aynı c de olduğu gibi iter ile ilerleyip işlemleri yapıyoruz.

Aşağıdaki başlangıç olarak çok basit kod paylaştım. Başka bir yazımda linked list ile yazılmış güzel proje falan görürsem eklerim.

public class Linkedlst {
    public static void printEmployees(LinkedList<String> list){
        System.out.println("---Calisanlar listesi---\n" );
        for(String s : list) {
            System.out.println(s);
        }
        
    }
    
    public static void addEmployees(LinkedList<String> list){
            
            Scanner scanner = new Scanner(System.in);
            System.out.println("Calisan İsmi Ekleyin Calisiyor ... ");
            for(int i=0; i<5; i++ ){
                String item = scanner.nextLine();
                list.add(item);
            }
            
    }
    public static void deleteAnEmployee(LinkedList<String> list){
        ListIterator<String> iter = list.listIterator();
        
        while(iter.hasNext()){
            list.remove();
        }
        
    }
   
    
    
    public static void main(String[] args) {
        
        LinkedList<String> newlist = new LinkedList();
        addEmployees(newlist);
        printEmployees(newlist);
        deleteAnEmployee(newlist);
        printEmployees(newlist);
            
  
    }
    

}

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir