0Pricing
Java Academy · Ders

ListIterator ve Çift Yönlü Gezinme

ListIterator kullanarak listelerde ileri ve geri gezinin ve yineleme sırasında öğeleri değiştirin.

ListIterator ve Çift Yönlü Gezinme, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.

ListIterator

ListIterator<T>, Iterator<T> arayüzünü geriye doğru gezinme, dizin tabanlı konumlandırma ve gezinme sırasında öğe ekleyip değiştirme özellikleriyle genişletir.

ListIterator API'si

Iterator'a ek yöntemler: hasPrevious(), previous(), nextIndex(), previousIndex(), set(), add().

import java.util.*;

List<String> list = new ArrayList<>(List.of("A", "B", "C", "D"));
ListIterator<String> lit = list.listIterator();

// Forward traversal
while (lit.hasNext()) {
    System.out.print(lit.nextIndex() + ":" + lit.next() + " ");
}
// 0:A 1:B 2:C 3:D

System.out.println();

// Backward traversal
while (lit.hasPrevious()) {
    System.out.print(lit.previousIndex() + ":" + lit.previous() + " ");
}
// 3:D 2:C 1:B 0:A

Bir Konumdan Başlama

Belirli bir dizinden başlayan bir ListIterator oluşturmak için listIterator(index) kullanın.

List<Integer> nums = new ArrayList<>(List.of(10, 20, 30, 40, 50));

// Start at index 2 (30)
ListIterator<Integer> lit = nums.listIterator(2);

System.out.println(lit.next());     // 30
System.out.println(lit.next());     // 40
System.out.println(lit.previous()); // 40
System.out.println(lit.previous()); // 30
System.out.println(lit.previous()); // 20

Dolaşım Sırasında set()

set(), next() veya previous() tarafından döndürülen son öğeyi değiştirir. Bu işlem verimlidir: LinkedList için O(1), ArrayList için O(1).

List<String> words = new ArrayList<>(List.of("hello", "world", "java"));
ListIterator<String> lit = words.listIterator();

while (lit.hasNext()) {
    String word = lit.next();
    lit.set(word.toUpperCase()); // replace each with uppercase
}

System.out.println(words); // [HELLO, WORLD, JAVA]

Dolaşım Sırasında add()

add(element), bir sonraki konumun önüne ekleme yapar. Eklenen öğe, sonraki next() çağrısı tarafından döndürülmez; imlecin zaten "gerisinde" kalmıştır.

List<Integer> numbers = new ArrayList<>(List.of(1, 2, 3));
ListIterator<Integer> lit = numbers.listIterator();

while (lit.hasNext()) {
    int n = lit.next();
    lit.add(n * 10); // insert n*10 after each element
}

System.out.println(numbers); // [1, 10, 2, 20, 3, 30]

Bir Listeyi Yerinde Tersine Çevirme

Yeni bir liste oluşturmadan, ListIterator kullanarak bir listeyi O(n) zamanda tersine çevirme.

static <T> void reverse(List<T> list) {
    ListIterator<T> front = list.listIterator(0);
    ListIterator<T> back  = list.listIterator(list.size());

    for (int i = 0, n = list.size() / 2; i < n; i++) {
        T frontVal = front.next();
        T backVal  = back.previous();
        front.set(backVal);
        back.set(frontVal);
    }
}

List<String> data = new ArrayList<>(List.of("a","b","c","d","e"));
reverse(data);
System.out.println(data); // [e, d, c, b, a]

nextIndex ve previousIndex

nextIndex(), next() tarafından döndürülecek öğenin dizinini döndürür. previousIndex(), previous() tarafından döndürülecek öğenin dizinini döndürür.

List<String> list = List.of("X", "Y", "Z");
ListIterator<String> lit = list.listIterator();

System.out.println(lit.nextIndex());     // 0
System.out.println(lit.previousIndex()); // -1 (before start)

lit.next(); // consume X
System.out.println(lit.nextIndex());     // 1
System.out.println(lit.previousIndex()); // 0

LinkedList ListIterator Performansı

LinkedList için ListIterator, dolaşım işaretçileri izlediği için O(1) next/previous performansı sağlar. LinkedList üzerinde get(i) işlemi O(n) sürer; verimli dolaşım için ListIterator kullanın.

import java.util.*;

LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < 5; i++) list.add(i * 10);

// Efficient: O(n) total for traversal via ListIterator
ListIterator<Integer> lit = list.listIterator();
while (lit.hasNext()) {
    int val = lit.next();
    if (val == 20) lit.set(99); // O(1) update
}
System.out.println(list); // [0, 10, 99, 30, 40]

ListIterator ile Palindrom Denetimi

İki yönlü dolaşıma dair zarif bir örnek: bir listenin palindrom olup olmadığını denetlemek.

static <T> boolean isPalindrome(List<T> list) {
    ListIterator<T> front = list.listIterator(0);
    ListIterator<T> back  = list.listIterator(list.size());

    for (int i = 0, n = list.size() / 2; i < n; i++) {
        if (!front.next().equals(back.previous())) return false;
    }
    return true;
}

System.out.println(isPalindrome(List.of(1, 2, 3, 2, 1))); // true
System.out.println(isPalindrome(List.of(1, 2, 3, 4)));    // false

Yineleyici ve ListIterator Karşılaştırması

Temel farklar:

  • Yineleyici: yalnızca ileri yönlüdür; hasNext/next/remove
  • ListIterator: iki yönlüdür; hasPrevious/previous, nextIndex/previousIndex, set/add
  • ListIterator yalnızca listeler içindir (Set veya Queue için değil)

ListIterator ile Geri Alma ve Yineleme

Karakterler arasında verimli geri alma ve yineleme gezintisi için ListIterator kullanan, imleç tabanlı bir metin düzenleyicisi.

import java.util.*;

class TextEditor {
    private final LinkedList<Character> chars = new LinkedList<>();
    private ListIterator<Character> cursor;

    TextEditor() { cursor = chars.listIterator(); }

    void type(char c) { cursor.add(c); } // insert before cursor

    void moveCursorLeft()  { if (cursor.hasPrevious()) cursor.previous(); }
    void moveCursorRight() { if (cursor.hasNext()) cursor.next(); }

    void backspace() {
        if (cursor.hasPrevious()) { cursor.previous(); cursor.remove(); }
    }

    String text() {
        StringBuilder sb = new StringBuilder();
        chars.forEach(sb::append);
        return sb.toString();
    }
}

TextEditor ed = new TextEditor();
ed.type('H'); ed.type('e'); ed.type('l'); ed.type('o');
ed.moveCursorLeft(); ed.moveCursorLeft();
ed.type('l');
System.out.println(ed.text()); // Hello

ListIterator Ne Zaman Kullanılmalı

Şu durumlarda ListIterator kullanın:

  • Bir listede geriye doğru dolaşmanız gerektiğinde
  • Dolaşım sırasında öğeleri set() ile değiştirmeniz gerektiğinde
  • Dolaşım sırasında öğeleri add() ile eklemeniz gerektiğinde
  • nextIndex()/previousIndex() ile konum takibi gerektiğinde

Hızlı Denetim

ListIterator.set() ne yapar?

Özet: ListIterator ve İki Yönlü Dolaşım

Temel çıkarımlar:

  • ListIterator, Iterator'ı hasPrevious(), previous(), set(), add() ile genişletir
  • Belirli bir konumda ListIterator oluşturun: listIterator(index)
  • set(), next() veya previous() tarafından döndürülen son öğeyi değiştirir
  • add(), geçerli imleç konumunun önüne ekleme yapar
  • nextIndex() ve previousIndex(), konum bilgisi sağlar
  • O(1) dolaşım ve değişiklik için LinkedList ListIterator kullanın

Sıkça Sorulan Sorular

“ListIterator ve Çift Yönlü Gezinme” dersi ücretsiz mi?

Evet — “ListIterator ve Çift Yönlü Gezinme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.

“ListIterator ve Çift Yönlü Gezinme” dersinde ne öğreneceğim?

ListIterator kullanarak listelerde ileri ve geri gezinin ve yineleme sırasında öğeleri değiştirin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Java Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“ListIterator ve Çift Yönlü Gezinme” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Iterable ve Iterator Sözleşmeleri
  2. Özel Bir Iterator Uygulama
  3. ListIterator ve Çift Yönlü Gezinme
  4. Fail-Fast ve Fail-Safe Yineleyiciler
← Java Academy Sayfasına Dön