Daftar Tertaut Ganda dan Cara Menerapkannya dengan Python 3

Linked Linked adalah cara linear menyimpan data. Ini terdiri dari node yang berisi data serta petunjuk dengan cara untuk sampai ke bagian data selanjutnya. Pikirkan node sebagai anggota rantai. Setiap rantai bergantung satu sama lain untuk menjaga ikatan yang kuat. Misalnya, jika tautan tengah kehilangan segalanya setelah itu gagal. Itu bukan lagi rantai yang lengkap! Bagaimana ini diterjemahkan ke daftar tertaut? Jika salah satu petunjuk hilang atau salah, sisa data tidak lagi dapat dibaca.

Bukan rantai yang valid! Ini akan mematahkan daftar tertaut!

Namun, topik artikel ini adalah versi yang lebih fleksibel dari daftar tertaut - daftar tertaut ganda. Dibandingkan dengan daftar tertaut biasa (atau tunggal), daftar tertaut ganda menyertakan penunjuk lain yang disebut sebelumnya. Seperti yang Anda tebak, ini memungkinkan node untuk mengetahui di mana node sebelumnya. Sebagai perbandingan, daftar yang ditautkan sendiri harus melintasi seluruh daftar lagi ke titik sebelumnya untuk mencapai titik yang sama.

Untuk informasi tentang daftar yang terhubung sendiri, silakan kunjungi artikel teman sekelas saya:

Seperti yang disebutkan sebelumnya, node menunjuk ke lokasi lain di memori. Apa artinya? Yah, tidak seperti array yang disimpan di lokasi yang berdekatan, daftar tertaut hanya memiliki pointer. Dalam diagram di bawah ini, setiap blok memori (merah) memiliki dua pointer yang mengarah ke sana. Ini mengakses informasi itu dengan melihat ke pointer Next (hitam). Jika ingin menemukan blok sebelumnya, ia akan melihat pointer Sebelumnya (putih).

Jadi, bagaimana cara menerapkan daftar yang ditautkan dua kali lipat? Begini caranya dengan Python 3

Cukup tambahkan .prev ke kelas Node Anda. Sekarang Anda siap untuk mulai mengimplementasikan!

Keuntungan - Dengan kode Python 3!

Apa beberapa keuntungan dari daftar yang ditautkan dua kali lipat dari yang ditautkan sendiri? Nah, dengan daftar tertaut dua kali lipat, Anda dapat bergerak maju dan mundur di antara node Anda. Ini membuat hal-hal seperti memasukkan sangat mudah. Dengan daftar tertaut dua kali lipat, Anda hanya melintasi daftar tertaut ke simpul yang Anda inginkan dan kemudian memanggil simpul sebelumnya.

Kerugian

Meskipun ada hal-hal hebat tentang daftar tertaut, ini bukan solusi serba bisa semua. Seperti banyak struktur data dan algoritme ini harus menjadi alat di gudang Anda. Salah satu kelemahan dari daftar yang ditautkan sendiri adalah bahwa ada lebih banyak konsumsi memori karena setiap tautan dalam daftar yang ditautkan dua kali perlu melacak pointer sebelumnya. Selain itu, sulit untuk melacak penunjuk kata.

Saya sebenarnya masih dalam proses mempraktikkan implementasi mereka. Ini akan menjadi implementasi sukses kedua saya pada penulisan artikel ini (April 2019). Setiap kali menjadi sedikit lebih mudah tetapi saya masih perlu menggambar diagram tentang bagaimana pointer sebelumnya berinteraksi dengan semua fungsi saya yang lain.

Tapi untuk apa ini digunakan?

Saya mendengar Anda bertanya. Pikirkan kapan saja Anda pernah melihat sebelumnya dan berikutnya. Ada beberapa cara yang jelas dan halus yang dapat diterapkan.

Sumber: https://pbs.twimg.com/media/DxzXvUKXgAAvmxx.jpg

Bagaimana dalam kasus seperti pemutar musik? Ini memiliki tombol berikutnya dan sebelumnya yang sangat eksplisit. Daftar tertaut ganda dapat digunakan untuk menggilir kedua lagu tersebut.

Atau bagaimana dengan browser? Ini juga memiliki cara eksplisit untuk maju dan mundur antara halaman web yang Anda kunjungi.

Sekarang pikirkan tentang perangkat lunak pengolah kata atau editor foto pilihan Anda. Setiap kali Anda melakukan kesalahan, Anda dapat menekan CTRL (CMD untuk Mac) + Z untuk membatalkan tindakan terakhir itu. Demikian juga, Anda dapat mengulang apa yang telah Anda batalkan dengan CTRL (CMD untuk Mac) + Y. Sekarang mengapa ini terdengar akrab? Ini juga dapat diimplementasikan dengan daftar yang ditautkan ganda! Pointer sebelumnya menunjuk ke tindakan yang dilakukan sambil juga dapat mengulangi tindakan jika Anda membatalkan terlalu banyak.

Sumber: https://gfycat.com/brilliantbeautifuldassieSumber: https://www.solitairecardgames.com/how-to-play-solitaire

Implementasi yang kurang jelas yang saya pikirkan ada di game Solitaire. Ke samping adalah gambar terminologi Solitaire untuk membantu mengilustrasikan poin saya.

Gim ini adalah contoh cemerlang di mana Anda harus selalu dapat melihat kartu sebelumnya dan berikutnya apakah itu ada di tablo atau tumpukan sampah. Saat Anda memainkan kartu dari tumpukan sampah ke tablo, tumpukan sampah diperbarui dengan kartu sebelumnya.

Untuk diskusi yang lebih hidup tentang penggunaan pada daftar yang ditautkan dua kali lipat, saya sarankan untuk melihat diskusi ini di stackoverflow:

Jadi, lain kali Anda menerapkan daftar tertaut, mengapa tidak mencoba yang tertaut ganda? Ini bukan kode yang lebih banyak di atas daftar yang tertaut dan ada manfaat besar!

Sumber daya tambahan

Tautan lengkap ke implementasi Python 3 saya dari daftar tertaut ganda dapat ditemukan di repo Github saya.

Jika Anda ingin rantai cetak 3d dari daftar yang ditautkan dua kali lipat, saya telah mengunggahnya ke Thingiverse.

https://www.geeksforgeeks.org/doubly-linked-list/

https://www.tutorialspoint.com/data_structures_algorithms/doubly_linked_list_algorithm.htm

https://www.youtube.com/watch?v=JdQeNxWCguQ