Senarai Terpaut dan Cara Melaksanakannya dalam Python 3

Senarai yang dipautkan adalah cara linear untuk menyimpan data. Ia terdiri daripada nod yang mengandungi data serta petunjuk dengan bagaimana untuk sampai ke sekeping data seterusnya. Fikirkan tentang nod sebagai ahli rantai. Setiap rantai bergantung kepada satu sama lain untuk memastikan ikatan yang kukuh. Jika, contohnya, pautan tengah hilang segalanya selepas itu gagal. Ia bukan lagi rangkaian lengkap! Bagaimanakah ia diterjemahkan ke senarai yang dikaitkan? Jika salah satu pointer hilang atau salah data yang lain tidak lagi boleh dibaca.

Bukan rantai yang sah! Ini akan memecah senarai tera!

Walau bagaimanapun, topik artikel ini adalah pada versi yang berkaitan dengan senarai berkaitan - senarai yang dipaut dua kali. Berbanding dengan senarai terikat (atau secara tunggal), senarai yang dipautkan dua kali termasuk penunjuk lain yang dipanggil sebelumnya. Seperti yang anda sangka, ini membolehkan nod untuk mengetahui di mana nod terdahulu. Sebagai perbandingan, satu senarai hubungan yang sepatutnya perlu melintasi keseluruhan senarai sekali lagi ke titik sebelumnya untuk mencapai titik yang sama.

Untuk mendapatkan maklumat mengenai senarai yang disambungkan secara bersama sila lawati artikel kelas saya:

Seperti yang dinyatakan sebelum ini, nod menunjuk ke lokasi lain dalam ingatan. Apa maksudnya? Nah, tidak seperti array yang disimpan di lokasi yang bersebelahan, senarai yang dikaitkan hanya mempunyai petunjuk. Dalam rajah di bawah setiap blok ingatan (merah) mempunyai dua petunjuk yang menunjukkan kepadanya. Ia mengakses maklumat itu dengan melihat penunjuk Seterusnya (hitam). Sekiranya ia mahu mencari blok sebelumnya, ia akan melihat penunjuk Sebelumnya (putih).

Jadi, bagaimanakah seseorang melaksanakan senarai yang dipaut dua kali? Berikut adalah cara dalam Python 3

Hanya tambah .prev ke kelas Node anda. Sekarang anda sudah bersedia untuk melaksanakannya!

Kelebihan - Dengan kod Python 3!

Apakah beberapa kelebihan senarai dwikutub yang dikaitkan dengan satu hubungan tunggal? Nah, dengan senarai yang dipaut dua kali, anda boleh bergerak ke belakang dan ke depan antara nod anda. Ini menjadikan perkara seperti memasukkan sangat mudah. Dengan senarai dwikutub yang anda lawati, anda akan melayari senarai yang dikaitkan dengan node yang anda mahu dan kemudian memanggil nod sebelumnya.

Kelemahan

Walaupun terdapat banyak perkara mengenai senarai berkaitan, ia bukan satu-satunya penyelesaian. Seperti banyak struktur data dan algoritma ini harus menjadi alat dalam senjata anda. Salah satu kelemahan di atas satu senarai yang tersambung adalah bahawa terdapat lebih banyak penggunaan ingatan kerana setiap pautan dalam senarai yang dipautkan ganda perlu menjejaki penunjuk sebelumnya. Di samping itu, sukar untuk mengesan penunjuk tersebut.

Saya sebenarnya masih dalam proses mengamalkan pelaksanaannya. Ini akan menjadi pelaksanaan kedua saya yang berjaya seperti penulisan artikel ini (April 2019). Setiap kali mendapat sedikit lebih mudah tetapi saya masih perlu membuat gambarajah tentang cara penunjuk terdahulu berinteraksi dengan semua fungsi saya yang lain.

Tetapi apa yang akan digunakan untuk ini?

Saya dengar anda bertanya. Fikirkan tentang bila-bila masa yang anda lihat sebelumnya dan seterusnya. Terdapat beberapa cara yang jelas dan halus yang boleh dilaksanakan.

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

Bagaimana pula dalam kes seperti pemain muzik? Ia mempunyai butang depan dan sebelumnya yang sangat jelas. Senarai yang dipautkan dua kali boleh digunakan untuk membuat kitaran di antara dua lagu tersebut.

Atau bagaimana dengan pelayar? Ini juga mempunyai cara yang jelas untuk pergi ke belakang dan ke hadapan antara halaman web yang anda lawati.

Sekarang fikirkan perisian pemproses kata anda atau editor foto pilihan anda. Sebaik sahaja anda membuat kesilapan anda boleh menekan CTRL (CMD for Mac) + Z untuk membatalkan tindakan yang terakhir. Begitu juga, anda dapat mengulang semula apa yang telah dibatalkan dengan CTRL (CMD for Mac) + Y. Sekarang kenapa bunyi ini biasa? Ia juga boleh dilaksanakan dengan senarai yang dipaut dua kali! Petunjuk sebelumnya menunjukkan tindakan yang telah dilakukan sementara juga dapat mengulang tindakan jika anda membatalkan terlalu banyak.

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

Pelaksanaan yang kurang jelas yang saya fikirkan adalah dalam permainan Solitaire. Di sebelahnya adalah imej istilah Solitaire untuk membantu menggambarkan maksud saya.

Permainan ini adalah satu contoh yang bersinar di mana anda sentiasa perlu dapat melihat kad sebelumnya dan seterusnya sama ada di meja atau timbunan buangan. Semasa anda memainkan kad dari longgokan sampah ke meja, tumpukan buangan dikemas kini dengan kad sebelumnya.

Untuk perbincangan penggunaan yang lebih meriah mengenai senarai dobel yang berkaitan, saya akan mengesyorkan melihat perbincangan ini mengenai stackoverflow:

Jadi pada masa akan datang anda melaksanakan senarai terkaitan kenapa tidak mencuba satu hubungan ganda? Ia bukan kod lebih banyak di atas senarai yang dipautkan dan terdapat manfaat yang mendalam!

Sumber tambahan

Pautan penuh untuk pelaksanaan Python 3 saya senarai dobel dihubungkan boleh didapati di repo Github saya.

Sekiranya anda ingin rantai 3d yang boleh dicetak senarai dobel yang saya muat naik 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