Apa cara termudah untuk menggunakan daftar tertaut di python? Dalam skema, daftar tertaut hanya ditentukan oleh '(1 2 3 4 5)
. Daftar Python [1, 2, 3, 4, 5]
, dan tupel, (1, 2, 3, 4, 5)
sebenarnya bukan daftar yang ditautkan, dan daftar yang ditautkan memiliki beberapa sifat yang bagus seperti penggabungan waktu konstan, dan kemampuan untuk mereferensikan bagian yang terpisah dari mereka. Buat mereka tidak berubah dan mereka sangat mudah untuk dikerjakan!
python
linked-list
Claudiu
sumber
sumber
Jawaban:
Berikut adalah beberapa fungsi daftar berdasarkan representasi Martin v. Löwis :
dimana
w = sys.stdout.write
Meskipun daftar tertaut ganda terkenal digunakan dalam resep set yang dipesan oleh Raymond Hettinger , daftar tertaut tunggal tidak memiliki nilai praktis dalam Python.
Saya tidak pernah menggunakan daftar tertaut tunggal di Python untuk masalah apa pun selain pendidikan.
Thomas Watnedal menyarankan sumber pendidikan yang bagus How to Think Like a Computer Scientist, Bab 17: Daftar tertaut :
Daftar tertaut adalah:
simpul yang berisi objek kargo dan referensi ke daftar tertaut.
sumber
Untuk beberapa kebutuhan, deque mungkin juga berguna. Anda dapat menambah dan menghapus item pada kedua ujung deque dengan biaya O (1).
sumber
deque
merupakan tipe data yang bermanfaat, ini bukan daftar yang ditautkan (meskipun diimplementasikan menggunakan daftar tertaut ganda di tingkat C). Jadi itu menjawab pertanyaan "apa yang akan Anda gunakan daripada daftar tertaut dengan Python?" dan dalam hal ini jawaban pertama harus (untuk beberapa kebutuhan) daftar Python biasa (juga bukan daftar yang ditautkan).linked_list[n]
) karena itu adalah O (n). Dequeues mengizinkannya, dan melakukannya di O (1). Namun, daftar tertaut, yang diberi iterator ke dalam daftar, dapat memungkinkan penyisipan dan penghapusan O (1), sedangkan deques tidak dapat (itu O (n), seperti vektor). (Kecuali di bagian depan dan akhir, di mana baik deques dan daftar tertaut sama-sama O (1). (Meskipun deque kemungkinan besar diamortisasi O (1). Daftar tertaut tidak.)O(n)
). Jika "hampir setiap cara" memungkinkan untuk mengabaikan perbedaan dalam O besar maka pernyataan Anda tidak ada artinya karena kita bisa menggunakan daftar Python builtin sebagai deque jika bukan untuk pop (0), masukkan (0, v) jaminan O besar .Saya menulis ini beberapa hari yang lalu
sumber
list_print()
.Jawaban yang diterima agak rumit. Ini adalah desain yang lebih standar:
Ini adalah
LinkedList
kelas sederhana berdasarkan desain C ++ dan Bab 17: Daftar tertaut , seperti yang direkomendasikan oleh Thomas Watnedal .sumber
X is None
lebih disukai==
. stackoverflow.com/a/2988117/1740227insert
bukan kasus khusus dari yang ketiga, sehingga Anda dapat sepenuhnya menghapuselif
klausa?Daftar yang tidak dapat diubah paling baik diwakili melalui dua tupel, dengan Tidak ada yang mewakili NIL. Untuk memungkinkan perumusan sederhana daftar tersebut, Anda dapat menggunakan fungsi ini:
Untuk bekerja dengan daftar seperti itu, saya lebih suka menyediakan seluruh koleksi fungsi LISP (yaitu pertama, kedua, ke-n, dll), daripada memperkenalkan metode.
sumber
Berikut adalah versi yang sedikit lebih kompleks dari kelas daftar tertaut, dengan antarmuka yang mirip dengan tipe urutan python (mis. Mendukung pengindeksan, pengirisan, penggabungan dengan urutan sewenang-wenang dll). Seharusnya memiliki O (1) prepend, tidak menyalin data kecuali perlu dan dapat digunakan cukup bergantian dengan tuple.
Ruang atau waktu tidak akan seefisien sel kontra sel, karena kelas python jelas sedikit lebih berat (Anda bisa sedikit memperbaiki hal-hal dengan "
__slots__ = '_head','_tail'
" mengurangi penggunaan memori). Namun akan memiliki karakteristik kinerja O besar yang diinginkan.Contoh penggunaan:
Penerapan:
sumber
llist - Tipe data daftar tertaut untuk Python
Modul daftar mengimplementasikan struktur data daftar tertaut. Ini mendukung daftar tertaut ganda, yaitu
dllist
dan struktur data yang terhubung sendiri-sendirisllist
.objek dllist
Objek ini mewakili struktur daftar data yang ditautkan ganda.
first
dllistnode
Objek pertama dalam daftar.None
jika daftar kosong.last
Terakhir
dllistnode
Objek dalam daftar. Tidak ada jika daftar kosong.objek dllist juga mendukung metode berikut:
append(x)
Tambahkan
x
ke sisi kanan daftar dan kembali dimasukkandllistnode
.appendleft(x)
Tambahkan
x
ke sisi kiri daftar dan kembali dimasukkandllistnode
.appendright(x)
Tambahkan
x
ke sisi kanan daftar dan kembali dimasukkandllistnode
.clear()
Hapus semua node dari daftar.
extend(iterable)
Tambahkan elemen dari
iterable
ke sisi kanan daftar.extendleft(iterable)
Tambahkan elemen dari
iterable
ke sisi kiri daftar.extendright(iterable)
Tambahkan elemen dari
iterable
ke sisi kanan daftar.insert(x[, before])
Tambahkan
x
ke sisi kanan daftar jikabefore
tidak ditentukan, atau masukkanx
ke sisi kiridllistnode before
. Kembali dimasukkandllistnode
.nodeat(index)
Kembalikan simpul (tipe
dllistnode
) diindex
.pop()
Hapus dan kembalikan nilai elemen dari sisi kanan daftar.
popleft()
Hapus dan kembalikan nilai elemen dari sisi kiri daftar.
popright()
Hapus dan kembalikan nilai elemen dari sisi kanan daftar
remove(node)
Menghapus
node
dari daftar dan kembalikan elemen yang disimpan di dalamnya.dllistnode
bendakelas
llist.dllistnode([value])
Kembalikan simpul daftar tertaut ganda, diinisialisasi (opsional) dengan
value
.dllistnode
objek memberikan atribut berikut:next
Node berikutnya dalam daftar. Atribut ini hanya baca.
prev
Node sebelumnya dalam daftar. Atribut ini hanya baca.
value
Nilai disimpan dalam simpul ini. Disusun dari referensi ini
daftar
class
llist.sllist([iterable])
Mengembalikan daftar tertaut tunggal yang diinisialisasi dengan elemen dariiterable
. Jika iterable tidak ditentukan, yang barusllist
kosong.Set atribut dan operasi yang serupa didefinisikan untuk
sllist
objek ini . Lihat referensi ini untuk informasi lebih lanjut.sumber
sumber
Saya mendasarkan fungsi tambahan ini pada Nick Stinemates
Metode dia telah menambahkan node baru di awal sementara saya telah melihat banyak implementasi yang biasanya menambahkan node baru di akhir tetapi apa pun, itu menyenangkan untuk dilakukan.
sumber
Berikut ini adalah apa yang saya pikirkan. Ini mirip dengan Riccardo C. , di utas ini, kecuali ia mencetak angka secara berurutan, bukan terbalik. Saya juga membuat objek LinkedList sebagai Python Iterator untuk mencetak daftar seperti yang Anda lakukan pada daftar Python normal.
sumber
Saya hanya melakukan ini sebagai mainan yang menyenangkan. Itu harus tetap selama Anda tidak menyentuh metode underscore-prefixed, dan mengimplementasikan sekelompok sihir Python seperti pengindeksan dan
len
.sumber
Saat menggunakan daftar tertaut yang tidak dapat diubah, pertimbangkan untuk menggunakan tupel Python secara langsung.
Sangat mudah, dan Anda bisa menyimpan fungsi tambahan seperti len (ls), x in ls, dll.
sumber
sumber
Saya telah menempatkan kelas daftar yang terhubung sendiri dengan Python 2.x dan 3.x di https://pypi.python.org/pypi/linked_list_mod/
Ini diuji dengan CPython 2.7, CPython 3.4, Pypy 2.3.1, Pypy3 2.3.1, dan Jython 2.7b2, dan dilengkapi dengan test suite otomatis yang bagus.
Ini juga termasuk kelas LIFO dan FIFO.
Mereka tidak berubah meskipun.
sumber
sumber
Kelas Daftar Tertaut
Pemakaian
Keluaran
sumber
Berikut ini adalah implementasi sederhana saya:
Keluaran:
sumber
Ini solusinya:
Penerapan
Pemakaian
Ide Implementasi Asli
sumber
Saya pikir implementasi di bawah ini mengisi tagihan dengan cukup anggun.
sumber
sumber
Pertama-tama, saya anggap Anda ingin daftar tertaut. Dalam praktiknya, Anda dapat menggunakan
collections.deque
, yang implementasi CPython saat ini adalah daftar blok yang ditautkan ganda (setiap blok berisi array 62 objek kargo). Ini menggolongkan fungsionalitas daftar tertaut. Anda juga dapat mencari ekstensi C yang dipanggilllist
pypi. Jika Anda menginginkan implementasi murni ADD Python dan mudah diikuti dari daftar tertaut, Anda dapat melihat penerapan minimal berikut saya.sumber
Contoh daftar tertaut ganda (simpan sebagai linkedlist.py):
Pengujian (simpan sebagai test.py):
Output :
sumber
Saya juga menulis Daftar Tertaut Tunggal berdasarkan pada beberapa tutorial, yang memiliki dua kelas dasar Node dan Daftar Tertaut, dan beberapa metode tambahan untuk memasukkan, menghapus, membalik, menyortir, dan semacamnya.
Ini bukan yang terbaik atau termudah, bekerja dengan baik.
sumber
Memperluas jawaban Nick Stinemates
sumber
2 sen saya
sumber
sumber
Daftar Tertaut ganda saya mungkin dapat dimengerti oleh noobies. Jika Anda terbiasa dengan DS dalam C, ini cukup mudah dibaca.
Meskipun banyak penyederhanaan dapat ditambahkan ke kode ini, saya pikir implementasi yang mentah akan membuat saya lebih mudah.
sumber
Jika Anda hanya ingin membuat daftar disukai sederhana kemudian merujuk kode ini
l = [1, [2, [3, [4, [5, [6, [7, [8, [10]]]]]]]]]]]]
untuk memvisualisasikan eksekusi untuk cod ini Kunjungi http://www.pythontutor.com/visualize.html#mode=edit
sumber