2009-12-25 79 views
9

Làm thế nào để xóa một nút trong danh sách liên kết đơn lẻ chỉ với một con trỏ trỏ đến nút sẽ bị xóa?Xóa một nút trong danh sách liên kết đơn lẻ

[Bắt đầu và kết thúc con trỏ không được tiết lộ, thông tin có sẵn là con trỏ đến nút cần được xóa]

Trả lời

17

Bạn có thể xóa một nút mà không nhận được nút trước đó, bằng cách để nó bắt chước các nút sau và xóa mà một thay vào đó:

void delete(Node *n) { 
    if (!is_sentinel(n->next)) { 
    n->content = n->next->content; 
    Node *next = n->next; 
    n->next = n->next->next; 
    free(next); 
    } else { 
    n->content = NULL; 
    free(n->next); 
    n->next = NULL; 
    } 
} 

Như bạn có thể thấy, bạn sẽ cần phải xử lý đặc biệt cho phần tử cuối cùng. Tôi đang sử dụng một nút đặc biệt làm nút gửi để đánh dấu kết thúc có contentnextNULL.

UPDATE: các dòng Node *next = n->next; n->next = n->next->next cơ bản shuffles nội dung nút, và giải phóng các nút: Hình ảnh mà bạn nhận được một tham chiếu đến nút B để được xóa trong:

A   /To be deleted 
    next ---> B 
       next ---> C 
          next ---> *sentinel* 

Bước đầu tiên là n->content = n->next->content: sao chép nội dung của nút sau vào nút để được "xóa":

A   /To be deleted 
    next ---> C 
       next ---> C 
          next ---> *sentinel* 

sau đó, thay đổi next điểm:

A   /To be deleted 
    next ---> C  /---------------- 
       next ---| C   | 
          next ---> *sentinel* 

kế website thực sự miễn phí các yếu tố sau đây, nhận được đối với trường hợp cuối cùng:

A   /To be deleted 
    next ---> C 
       next ---> *sentinel* 
+0

Nút * tiếp theo = n-> tiếp theo; n-> next = n-> next-> next; bạn có thể giải thích thêm điều này không? – user215968

+0

Nếu danh sách được liên kết đủ dài thì nội dung chuyển dịch có phải là giải pháp khả thi không? – user215968

+0

@unknown, vâng, nó sẽ là một giải pháp khả thi. Cách tiếp cận này có thể làm phức tạp thêm bí danh (một mã khác giữ một tham chiếu đến các nút bị ảnh hưởng và như vậy); nhưng bạn sẽ có điều đó anyway. – notnoop

4

Các chỉ hợp lý và an toàn tùy chọn dưới những hạn chế như vậy là để đánh dấu nút xóa mà không thực sự bỏ liên kết nó, trì hoãn mà đến một thời gian sau đó.

+0

Không phải là lựa chọn duy nhất mà là lựa chọn tốt nhất không phải là +1. Chúng tôi làm điều đó trong hệ thống của chúng tôi khá một chút với đánh dấu không sử dụng/trì hoãn xóa. – Adisak

16

Không thể.

Có nhiều lỗi để bắt chước quá trình xóa.

Nhưng không ai trong số đó thực sự sẽ xóa nút mà con trỏ trỏ đến.

Giải pháp phổ biến của xóa sau nút và sao chép nội dung của nó đến thực tế nút để bị xóa có tác dụng phụ nếu bạn có con trỏ bên ngoài trỏ đến nút trong danh sách, trong trường hợp một mà con trỏ bên ngoài trỏ đến nút sau sẽ trở nên lơ lửng.

Bạn có thể tìm thấy một số cuộc thảo luận về SO here.

Các vấn đề liên quan