Trong cuộc phỏng vấn Slashdot này, Linus Torvalds được trích dẫn:
Tôi đã thấy quá nhiều người xóa mục nhập danh sách liên kết đơn bằng cách theo dõi mục "trước" và sau đó xóa mục đó, làm một cái gì đó như
if (trước)
trước-> next = entry-> next;
khác
list_head = entry-> tiếp theo;và bất cứ khi nào tôi thấy mã như vậy, tôi chỉ đi "Người này không hiểu con trỏ". Và thật đáng buồn là nó khá phổ biến.
Những người hiểu con trỏ chỉ cần sử dụng "con trỏ tới con trỏ mục nhập" và khởi tạo nó bằng địa chỉ của list_head. Và sau đó khi họ duyệt qua danh sách, họ có thể xóa mục nhập mà không cần sử dụng bất kỳ điều kiện nào, chỉ bằng cách thực hiện "* pp = entry-> next".
Là một nhà phát triển PHP, tôi đã không chạm vào con trỏ kể từ Giới thiệu về C ở trường đại học một thập kỷ trước. Tuy nhiên, tôi cảm thấy rằng đây là một loại tình huống mà ít nhất tôi nên làm quen. Linus đang nói về cái gì vậy? Thành thật mà nói, nếu tôi được yêu cầu thực hiện một danh sách được liên kết và xóa một mục, cách 'sai' ở trên là cách mà tôi sẽ đi về nó. Tôi cần biết gì để viết mã như Linus nói tốt nhất?
Tôi đang hỏi ở đây chứ không phải trên Stack Overflow vì tôi thực sự không gặp vấn đề gì với mã sản xuất này.
prev
, thay vì lưu trữ toàn bộ nút, bạn chỉ có thể lưu trữ vị trí củaprev.next
, vì đó là điều duy nhất bạn quan tâm. Một con trỏ tới một con trỏ. Và nếu bạn làm điều đó, bạn sẽ tránh được sự ngớ ngẩnif
, vì bây giờ bạn không có trường hợp khó xửlist_head
là một con trỏ từ bên ngoài một nút. Con trỏ tới đầu danh sách sau đó giống như con trỏ tới nút tiếp theo.