ListIterator dan Traversal Dua Arah
Gunakan ListIterator untuk menelusuri list maju dan mundur serta mengubah elemen selama iterasi.
ListIterator dan Traversal Dua Arah adalah pelajaran Java Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Java Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Java Academy mencakup 4 pelajaran total.
ListIterator
ListIterator<T> memperluas Iterator<T> dengan penelusuran mundur, penempatan berbasis indeks, serta kemampuan menambahkan dan mengganti elemen selama iterasi.
API ListIterator
Metode tambahan selain Iterator: 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:AMemulai dari Suatu Posisi
Buat ListIterator yang dimulai dari indeks tertentu dengan listIterator(index).
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()); // 20set() Selama Iterasi
set() menggantikan elemen terakhir yang dikembalikan oleh next() atau previous(). Operasi ini efisien — O(1) untuk LinkedList dan O(1) untuk ArrayList.
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]add() Selama Iterasi
add(element) menyisipkan elemen sebelum posisi berikutnya. Elemen yang ditambahkan tidak dikembalikan oleh pemanggilan next() berikutnya — elemen tersebut sudah berada "di belakang" kursor.
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]Membalik List di Tempat
Gunakan ListIterator untuk membalik list dalam O(n) tanpa mengalokasikan list baru.
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 dan previousIndex
nextIndex() mengembalikan indeks elemen yang akan dikembalikan oleh next(). previousIndex() mengembalikan indeks elemen yang akan dikembalikan oleh previous().
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()); // 0Performa ListIterator pada LinkedList
ListIterator milik LinkedList mencapai O(1) untuk next/previous karena penelusuran dilakukan dengan mengikuti pointer. get(i) pada LinkedList memiliki kompleksitas O(n) — gunakan ListIterator untuk melakukan penelusuran secara efisien.
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]Pemeriksaan Palindrom dengan ListIterator
Contoh penelusuran dua arah yang elegan: memeriksa apakah sebuah list merupakan palindrom.
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))); // falsePerbandingan Iterator dan ListIterator
Perbedaan utama:
- Iterator: hanya maju, hasNext/next/remove
- ListIterator: dua arah, hasPrevious/previous, nextIndex/previousIndex, set/add
- ListIterator hanya untuk List, bukan Set atau Queue
Undo/Redo dengan ListIterator
Editor teks berbasis kursor yang menggunakan ListIterator untuk navigasi karakter undo/redo secara efisien.
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()); // HelloKapan Menggunakan ListIterator
Gunakan ListIterator ketika Anda memerlukan:
- Penelusuran list ke arah belakang
- Penggantian elemen selama penelusuran dengan set()
- Penyisipan elemen selama penelusuran dengan add()
- Pelacakan posisi melalui nextIndex()/previousIndex()
Pemeriksaan Singkat
Apa yang dilakukan oleh ListIterator.set()?
Ringkasan: ListIterator dan Penelusuran Dua Arah
Hal-hal penting:
- ListIterator memperluas Iterator dengan hasPrevious(), previous(), set(), add()
- Buat ListIterator pada posisi tertentu: listIterator(index)
- set() menggantikan elemen terakhir yang dikembalikan oleh next() atau previous()
- add() menyisipkan elemen sebelum posisi kursor saat ini
- nextIndex() dan previousIndex() memberikan informasi posisi
- Gunakan ListIterator pada LinkedList untuk penelusuran dan modifikasi O(1)
Pertanyaan yang Sering Diajukan
Apakah pelajaran “ListIterator dan Traversal Dua Arah” gratis?
Ya — teks lengkap “ListIterator dan Traversal Dua Arah” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Java Academy, upgrade ke CoddyKit PRO. Kursus Java Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “ListIterator dan Traversal Dua Arah”?
Gunakan ListIterator untuk menelusuri list maju dan mundur serta mengubah elemen selama iterasi. Kamu berlatih Java Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Java Academy?
Tidak diperlukan pengalaman sebelumnya. Java Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “ListIterator dan Traversal Dua Arah” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Java Academy ini?
Ya. Setiap pelajaran Java Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Kontrak Iterable dan Iterator
- Mengimplementasikan Iterator Kustom
- ListIterator dan Traversal Dua Arah
- Iterator Fail-Fast vs Fail-Safe