1. RiwayatLinkedList
Jawa nduweni kelas koleksi liyane sing diwarisake saka basa C++. Iki minangka LinkedList
kelas, sing ngetrapake "dhaptar sing disambung".
Ing njaba, a LinkedList
katon padha karo ArrayList
. Kelas LinkedList
duwe kabeh cara sing padha karo ArrayList
kelas. Ing asas, sampeyan bisa tansah nggunakake LinkedList
tinimbang ArrayList
lan kabeh bakal bisa.
Dadi kenapa kita butuh kelas dhaptar liyane?
Jawaban iki ana hubungane karo struktur internal kelas LinkedList
. Tinimbang array, nggunakake dhaptar sing disambung kaping pindho . Kita bakal nerangake apa sing sethitik mengko.
Struktur internal kelas LinkedList
sing beda ndadekake paling cepet kanggo nglebokake unsur ing tengah dhaptar.
Ing Internet, sampeyan kerep bisa nemokake perbandingan lan ArrayList
kelas LinkedList
:
Operasi | Metode | ArrayList | LinkedList |
---|---|---|---|
Tambah unsur |
|
Cepet | Banter banget |
Lebokake unsur |
|
alon-alon | Banter banget |
Njaluk unsur |
|
Banter banget | alon-alon |
Setel unsur |
|
Banter banget | alon-alon |
Mbusak unsur |
|
alon-alon | Banter banget |
Kabeh katon cukup cetha: yen sampeyan kudu nglebokake unsur ing dhaptar asring, gunakake LinkedList
; yen arang, banjur nggunakake ArrayList. Nanging kasunyatane rada beda.
2. Ora ana sing nggunakakeLinkedList
Ora ana sing nggunakake LinkedList
.
Malah penulis kelas LinkedList
bubar tweeted: "Apa ana wong sing bener-bener nggunakake LinkedList
? Aku nulis, lan aku ora tau nggunakake."
Dadi apa sing menehi hasil?
Kaping pisanan, kelas ArrayList
wiwit bisa nglebokake unsur ing tengah dhaptar kanthi cepet. Nalika nglebokake unsur ing tengah dhaftar, sampeyan kudu ngalih kabeh unsur sawise titik sisipan dening 1 menyang mburi dhaftar. Iki digunakake kanggo njupuk wektu.
Nanging saiki kabeh wis owah. Kabeh unsur Uploaded cedhak siji liyane ing blok memori sing padha, supaya operasi kanggo mindhah unsur dileksanakake dening printah tingkat kurang cepet banget :.System.arraycopy()
Kajaba iku, prosesor saiki duwe cache gedhe sing biasane bisa nahan kabeh array, sing ngidini unsur array bisa dipindhah ing cache tinimbang ing memori. A yuta unsur gampang dipindhah ing milidetik siji.
Kapindho, kelas LinkedList
bisa nglebokake unsur kanthi cepet yen sampeyan nglebokake kanthi nggunakake iterator. Yen sampeyan nggunakake iterator menyang liwat LinkedList
lan terus-terusan masang unsur anyar (utawa mbusak sing wis ana), operasi super cepet.
Yen sampeyan mung nambah unsur menyang LinkedList
obyek ing daur ulang, saben operasi insert cepet diiringi dening alon "njaluk unsur" operasi.
Kasunyatane luwih cedhak karo iki:
Operasi | Metode | ArrayList | LinkedList |
---|---|---|---|
Tambah unsur |
|
Cepet | Banter banget |
Lebokake unsur |
|
alon-alon | alon banget |
Njaluk unsur |
|
Banter banget | alon banget |
Setel unsur |
|
Banter banget | alon banget |
Mbusak unsur |
|
alon-alon | alon banget |
Lebokake nggunakake iterator |
|
alon-alon | Banter banget |
Mbusak nggunakake iterator |
|
alon-alon | Banter banget |
Napa entuk unsur saka LinkedList
operasi sing alon?
Sampeyan bisa mangsuli pitakon kasebut sawise ngerti kepiye LinkedList
strukture.
3. Carane LinkedList
wis kabentuk
LinkedList
nduweni struktur internal sing beda karo ArrayList
. Ora duwe array internal kanggo nyimpen unsur. Nanging, nggunakake struktur data sing diarani dhaptar tinta tikel kaping pindho .
Saben unsur saka dhaptar sing disambung kaping pindho nyimpen referensi menyang unsur sadurunge lan unsur sabanjure. Iki kaya garis ing toko, ing ngendi saben wong ngelingi wong sing ngadeg ing ngarep lan uga wong sing ngadeg ing mburi.
Iki minangka dhaptar kaya ing memori:
Sirah lan buntut (sèl kanthi latar mburi abu-abu) minangka variabel first
lan last
, sing nyimpen referensi kanggo Node
obyek.
Ing tengah, sampeyan duwe ranté Node
obyek (obyek, dudu variabel). Saben wong kasusun saka telung lapangan:
prev
- nyimpen referensi (link) menyangNode
obyek sadurunge (sel karo latar mburi kuning).value
— nyimpen Nilai saka unsur iki dhaftar (sel karo latar mburi ijo).next
- nyimpen referensi (link) menyang obyek sabanjureNode
(sel kanthi latar mburi biru)
Obyek kapindho (alamat F24) yaiku jejere ( next
) kanggo obyek pisanan lan sadurunge ( prev
) kanggo obyek katelu. Kolom kuning obyek katelu ngemot alamat F24 lan kolom biru obyek pisanan ngemot alamat F24.
Panah saka obyek pisanan lan katelu nuding obyek kapindho padha. Dadi bakal luwih bener kanggo nggambar panah kaya iki.
4. Lebokake unsur menyang dhaptar sing disambung
Kanggo nambah wong menyang baris kaya iki, sampeyan mung kudu njaluk ijin saka wong loro ngadeg jejere. Wong pisanan ngelingi wong anyar minangka "wong ing mburiku", lan wong liya ngelingi dheweke minangka "wong ing ngarepku".
Sampeyan mung kudu ngganti referensi saka rong obyek tetanggan:
Kita nambahake item anyar menyang dhaptar kanthi ngganti referensi obyek kapindho lan katelu. Obyek anyar yaiku sabanjure kanggo obyek kapindho lawas lan sadurunge kanggo obyek katelu lawas. Lan, mesthine, obyek anyar dhewe kudu nyimpen referensi sing bener: obyek sadurunge minangka obyek kapindho lawas, lan obyek sabanjure minangka obyek katelu lawas.
Mbusak unsur luwih gampang: Yen kita pengin mbusak, ayo ngomong, obyek kaping 100 saka dhaptar, kita mung kudu ngganti lapangan next
kanggo obyek kaping 99 supaya nuduhake obyek kaping 101, lan ngganti prev
lapangan kanggo obyek kaping 101 obyek supaya nuding menyang 99. Mekaten.
Nanging entuk obyek kaping 100 ora gampang.
5. Mbusak unsur saka dhaftar
Kanggo entuk unsur kaping 100 saka dhaptar sing disambung, sampeyan kudu:
Entuk obyek 1st: Sampeyan nindakake iki nggunakake first
variabel ing LinkedList
obyek kasebut. Bidang next
obyek 1 nyimpen referensi kanggo obyek kaping 2. Mangkene carane kita entuk obyek kapindho. Objek kaping 2 nduweni referensi kanggo katelu, lan liya-liyane.
Yen kita kudu njaluk referensi kanggo obyek 100th, kita kudu sequentially pindhah liwat kabeh obyek saka 1 kanggo 100th. Lan yen kita butuh unsur yuta ing dhaptar, kita kudu ngulang luwih saka yuta obyek siji-sijine!
Lan yen obyek iki ditambahake menyang dhaftar ing wektu sing beda-beda, padha bakal dumunung ing macem-macem bagean saka memori lan ora kamungkinan kanggo mungkasi munggah ing cache prosesor ing wektu sing padha. Iki tegese iterasi liwat unsur dhaptar sing disambung ora mung alon, nanging alon banget.
Mekaten ingkang kita tindakaken.
Dadi kenapa kita mulang sampeyan carane alon iki LinkedList
bisa digunakake?
Ya, sajrone wawancara kerja, sampeyan bakal ditakoni kepiye LinkedList
bedane karoArrayList
. temtunipun.
GO TO FULL VERSION