Kembali ke jurnalCATATAN FAJAR
Algorithms2 menit baca

Pengantar Manipulasi In-Place pada Linked List

Membalik linked list dengan mengubah link-nya sambil tetap menjaga akses ke node yang tersisa.

Membalik linked list nggak butuh list kedua. Node-nya bisa tetap di tempatnya, sementara link-nya yang berubah. Teknik in place ini membuka cara berpikir yang beda tentang linked list buat saya.

Linked list secara in place

Modifikasi in place memakai extra space O(1) di luar input. Untuk linked list, artinya meng-update pointer next tanpa mengalokasikan node pengganti. Waktu pertama kali saya mencoba membalik linked list, saya menyalin nilainya lalu membangun list baru:

javascript
function reverseLinkedListNaive(head) {
  const values = [];
  let current = head;

  // Collect all values
  while (current) {
    values.push(current.val);
    current = current.next;
  }

  // Create new list in reverse
  let newHead = null;
  for (let i = 0; i < values.length; i++) {
    newHead = new ListNode(values[i], newHead);
  }

  return newHead;
}

Loop-nya membaca nilai sesuai urutan aslinya dan menyisipkan setiap node baru di head. Ini membalik list-nya. Array values dan node pengganti memakai extra space O(n). Di luar platform soalnya, contoh ini butuh constructor ListNode(value, next).

Saya nggak butuh node baru. Saya menyimpan reference ke node sebelumnya, node saat ini, dan node berikutnya. Reference ini menjaga akses ke list waktu sebuah link berubah.

Implementasi in place-nya:

javascript
function reverseLinkedList(head) {
  let prev = null; // Previous node (starts as null)
  let current = head; // Current node we're processing

  while (current !== null) {
    let next = current.next; // Save next node
    current.next = prev; // Reverse the link!
    prev = current; // Move prev forward
    current = next; // Move current forward
  }

  return prev; // prev is now the new head
}

Setiap putaran loop menyimpan node berikutnya sebelum mengubah current.next. Lalu loop meng-set current.next ke prev dan memajukan prev ke node saat ini. Loop berlanjut dari node berikutnya yang udah disimpan tadi. Begitu current bernilai null, prev menunjuk ke head yang baru.

Kompleksitas dan penerapannya

List-nya ditelusuri sekali, jadi time complexity-nya O(n). Algoritmanya menyimpan tiga reference dan memakai extra space O(1).

Saya jadi tahu kalau cara menyambung ulang link yang sama juga muncul di:

  • Manajemen file system: Menyusun ulang struktur direktori
  • Manajemen memori: Mengoptimalkan susunan blok memori
  • Optimasi compiler: Menyusun ulang representasi kode

Manipulasi in place mengubah hubungan antar node, bukan menyalin data. Melacak node sebelumnya, saat ini, dan berikutnya udah cukup untuk membalik list dengan waktu linear dan extra space konstan. Mempelajari ini mengubah cara saya mendekati soal linked list: sekarang saya mencari cara aman untuk menulis ulang link yang udah ada lebih dulu.

TOPIK

MAKASIH UDAH BACA

Gimana menurutmu?

Reaksi atau obrolan, dua-duanya selalu ditunggu.

Memuat reaksi…

Bagikan

Memuat komentar...

LANJUT JELAJAH

Satu pikiran bawa ke pikiran lain.

Semua tulisan
Kembali ke semua tulisanSatu catatan, pelan-pelan.