Dalam wawancara Slashdot ini, Linus Torvalds dikutip mengatakan:
Saya telah melihat terlalu banyak orang yang menghapus entri daftar yang ditautkan tunggal dengan melacak entri "sebelumnya", dan kemudian menghapus entri, melakukan sesuatu seperti
if (prev)
prev-> next = entry-> next;
lain
list_head = entri-> selanjutnya;dan setiap kali saya melihat kode seperti itu, saya hanya pergi "Orang ini tidak mengerti petunjuk". Dan itu sangat umum.
Orang-orang yang mengerti pointer hanya menggunakan "pointer ke entry pointer", dan menginisialisasi dengan alamat dari list_head. Dan ketika mereka melintasi daftar, mereka dapat menghapus entri tanpa menggunakan kondisional apa pun, dengan hanya melakukan "* pp = entri-> selanjutnya".
Sebagai pengembang PHP saya belum menyentuh pointer sejak Pengantar C di universitas satu dekade lalu. Namun, saya merasa ini adalah jenis situasi yang setidaknya harus saya kenal. Apa yang Linus bicarakan? Sejujurnya, jika saya diminta untuk mengimplementasikan daftar tertaut dan menghapus item, cara 'salah' di atas adalah cara saya melakukannya. Apa yang perlu saya ketahui kode sebagai Linus mengatakan yang terbaik?
Saya bertanya di sini daripada di Stack Overflow karena saya sebenarnya tidak memiliki masalah dengan ini dalam kode produksi.
prev
, alih-alih menyimpan seluruh node, Anda hanya dapat menyimpan lokasiprev.next
, karena itulah satu-satunya hal yang Anda minati. Penunjuk ke penunjuk. Dan jika Anda melakukan itu, Anda menghindari yang konyolif
, karena sekarang Anda tidak memiliki kasus canggunglist_head
menjadi penunjuk dari luar node. Pointer ke kepala daftar kemudian secara semantik sama dengan pointer ke node berikutnya.