Hoşgeldiniz
Okuma Moduna Geç
11 Ocak 2018 - 00:39
Java - Linked Lists

Değişkenler çağırıldıklarında belli bir noktayı işaret ederler ve o noktada var olan değeri döndürürler. Öte yandan bir değişken farklı bir değişkene atandığında o artık hafızada farklı bir alandadır ve dilediğimiz gibi değiştirebiliriz. Yani:

int a = 10;
int b = a;
b = 20; // a = 10, b = 20

Fakat işler referans mantığında biraz daha farklı işliyor. Eğer elimizde bir dizi olduğunu varsayarak yukarıdaki işlemi yapmaya kalkarsak:

int[] a = {10,20,30,40,50};
int[] b = a;
b[1] = 25; // a = {10,25,30,40,50} , b = {10,25,30,40,50}

Çünkü ikinci satırda yer alan eşitlikte aslında yapılan işlem a dizisinin başlamış olduğu hafızadaki yeri b değişkenine atamak. Bu yüzden b değişkeninde değişiklik yapmak demek aslında hafızanın o noktasında değişiklik yapmak demek. Sonucunda da her iki dizi aynı noktayı çağırdığı için ikisinde birden sonuç değişecektir.

Linked List Nedir?

LinkedList iki veriyi tek bir bölgede tutar. İlki değeri, ikincisi kendisinden sonra gelen değeri temsil eder. Yani:

şeklinde bir yapıya sahiptirler. Bu görselde gördüğünüz yapı Node olarak tanımlanır ve birçok Node arka arkaya eklenerek bir liste halini alırlar. Bu listelerde Linked List olarak ifade edilir.

List Node Nasıl Oluşturulur?

List Node'lar içerisinde değer ve sonraki olarak 2 parametre bulunduruyorlar. Şu şekilde bir sınıf oluşturabiliriz:

public class ListNode {
	int data;
	ListNode next;
	
	ListNode(){
		this.data = -1;
		this.next = null;
	}
	ListNode(int data) {
		this.data = data;
		this.next = null;
	}
	ListNode(int data, ListNode next){
		this.data = data;
		this.next = next;
	}
}

Kodu incelediğimiz zaman temelde data ve next değişkenleri dikkat çekiyor. Geri kalan kısım zaten varsayılan constructorlar... Eğer biz genel sınıfımızda bir ListNode oluşturursak ya yalnızca değeri atayacağız ve sonraki kısmını null atayacak, ya da hem değeri hemde sonrakini atayacağız.

ListNode a = new ListNode(10);
a.next = new ListNode(20);
a.next.next = new ListNode(30);

System.out.println(a.data);
System.out.println(a.next.data);
System.out.println(a.next.next.data);

şeklinde ekrana çıktı verdirebiliriz.

10
20
30

Ama elbette bu çok büyük listelerde tek tek yazılacak bir durum değil!

Linked List Ekleme Yapmak

Başlangıca

public static void main(String[] args) {
	ListNode a = new ListNode(10);
	a.next = new ListNode(20);
	a.next.next = new ListNode(30);
	
	System.out.println("Başlangıç: "+a.data);
		
	a = addFirst(a, 50);
		
	System.out.println("Başlangıç: "+a.data);
}
	
static ListNode addFirst(ListNode b, int value) {
	ListNode c = new ListNode(value, b);
	return c;
}

Indis (Index) Değerine Göre

public static void main(String[] args) {
	ListNode a = new ListNode(10);
	a.next = new ListNode(20);
	a.next.next = new ListNode(30);
	
	a = addMiddle(a, 2, 35);
	
	while(a != null) {
		System.out.println(a.data);
		a = a.next;
	}
}

static ListNode addMiddle(ListNode b, int index, int value) {
	ListNode c = b;
	
	for(int i = 1; i<index; i++) {
		c = c.next;
	}
	
	ListNode add = new ListNode(value, c.next);
	c.next = add;
	
	return b;
}

Sona

public static void main(String[] args) {
	ListNode a = new ListNode(10);
	a.next = new ListNode(20);
	a.next.next = new ListNode(30);
	
	a = addLast(a, 35);
	
	while(a != null) {
		System.out.println(a.data);
		a = a.next;
	}
}

static ListNode addLast(ListNode b, int value) {
	ListNode c = b;
	
	while(c.next != null) {
		c = c.next;
	}
	c.next = new ListNode(value);
	
	return b;
}

Linked List get() Metodu

public static void main(String[] args) {
	ListNode a = new ListNode(10);
	a.next = new ListNode(20);
	a.next.next = new ListNode(30);
	
	int result = get(a, 2);
	System.out.println(result);
	
}

static int get(ListNode b, int index) {
	ListNode c = b;
	
	for(int i = 0; i<index; i++) {
		c = c.next;
	}
	return c.data;
}

Linked List remove() Metodu

public static void main(String[] args) {
	ListNode a = new ListNode(10);
	a.next = new ListNode(20);
	a.next.next = new ListNode(30);
	
	a = remove(a, 1);
	
	while(a != null) {
		System.out.println(a.data);
		a = a.next;
	}
}

static ListNode remove(ListNode b, int index) {
	ListNode c = b;
	
	for(int i = 1; i<index; i++) {
		c = c.next;
	}
	c.next = c.next.next;
	return c;
}
Sponsorlu Bağlantı
Yorumlar
Metin
04 Mart 201822:14
Sitenizi takip ediyorum ve Java ile ilgili bir şeyler yapmaya çalışıyorum. Sizce Java üzerine mi kendimi geliştirmeliyim yoksa C,C#,C++,Phthon dillerinden biriyle mi kendimi geliştirmeliyim? Hangi dili öğrenmem bana daha çok yarar sağlar?
123
Cevapla
1
Yorumu Beğen
1
Yorumu Beğenme
Mert Topuz
04 Mart 201822:46
2018 Popüler Programlama Dilleri'nde zirvede olması, geliştirici kitlesinin genişliği ve kütüphaneleri ile Java her zaman cepte olması gereken bir dil olarak görüyorum. Elbette bir dilin tüm detaylarını bilmek için doğrudan Java geliştiricisi olmak gerekir fakat yaş ele alınarak bu ilerleyen zamanlara da bırakılabilir. Tercihinizi her şeyin birazını, bir şeyin tamamını bilmeliyim olarak belirleyebilirsiniz. C veya C# bilmenin size herhangi bir zararı olmayacaktır, şahsi görüşüm onlarda bilinmelidir. Burada ince çizgi ise hangisi üzerine yoğunlaşılması gerektiğidir. İşte bu noktada da tavsiye vermek yerine projeleri incelemenizi öneririm. Popüler projelerde en çok kullanılan dilleri önünüze alarak gelecekte çıkartacağınız projelerde hangisi işinize yarayacaksa onu seçmek daha doğru bir adım olacaktır. C# ve Java biliyor olmak size iş hayatınızda büyük kazançlar sağlayacaktır.
1
Yorumu Beğen
1
Yorumu Beğenme
Bir Yorum da Sen Bırak
Adınız ve Soyadınız
Mail Adresiniz
Mail adresinizi yalnızca yönetici görüntüleyebilir.
Web Siteniz
Yorumunuz
Yorumu Gönder