Tôi đang học sys/queue.h
từ FreeBSD và tôi có một câu hỏi:Tại sao danh sách được liên kết kép trong sys/queue.h duy trì địa chỉ của phần tử tiếp theo trước đó?
Trong sys/queue.h
, LIST_ENTRY
được định nghĩa như sau:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
Tại sao nó duy trì địa chỉ của phần tử tiếp theo trước (struct type **le_prev
) thay vì chỉ đơn giản là elment trước như struct type *le_prev
?
Bạn có nghĩa là việc triển khai này nhằm ngăn chặn việc truyền tải ngược cũng như đạt được O (1) chèn và xóa không? –
@YanzheChen phức tạp của (tuyến tính) danh sách hoạt động sẽ không thay đổi khi bạn sử dụng một con trỏ duy nhất và và con trỏ đôi không ngăn chặn traversal lạc hậu. Tôi nghĩ, phần quan trọng là "hoặc một mảng con trỏ tiến"; khi có bảng (băm) như vậy, việc loại bỏ sẽ rẻ hơn khi địa chỉ của con trỏ trước đó được lưu trữ. – ensc
@ensc Tôi đã đọc [bài đăng] này (http://stackoverflow.com/questions/9362896/deleting-any-node-from-a-single-linked-list-when-only-pointer-to-that-node- is-gi) và hiểu rằng việc xóa trong danh sách liên kết đơn có thể đạt được trong O (1) nếu nó không phải là nút đuôi. Nhưng tại sao con trỏ kép không ** không ** ngăn chặn sự truyền tải ngược? Làm thế nào để thực hiện các traversal lạc hậu? Và tôi không hiểu ** phần quan trọng ** bạn đã đề cập đến. Bạn có thể giải thích điều này chi tiết hơn không? –