Suppose we are considering a singly linked list and p is some node in the list which has both predecessor and successor nodes. Select the most correct java code snippet that deletes the node p.
Các phương án trả lời
Chọn một phương ánLời giảiChọn phương án để mở
Đáp án đúng: "Node f = head; while(f.next != p) f = f.next; f.next = p.next;". Danh sách liên kết đơn không có liên kết lùi, nên muốn tháo p ta buộc phải dò từ head để tìm nút tiền nhiệm; điều kiện f.next khác p dừng đúng lúc f là nút đứng ngay trước p, và f.next bằng p.next nối tiền nhiệm sang hậu nhiệm, đưa p ra khỏi chuỗi. Vì vậy "Node f = head; while(f.next != null) f = f.next; f.next = p.next;" sai vì vòng lặp chạy tới nút cuối rồi cho nút cuối trỏ về một nút nằm phía trước nó, tạo vòng tròn trong danh sách mà p vẫn còn nguyên. "Node f = head; while(f != p) f = f.next; f.next = p.next;" sai vì vòng lặp dừng khi f chính là p, nên f.next bằng p.next là gán cho chính nó, không liên kết nào thay đổi. "Node f = head; while(f != null) f = f.next; f.next = p.next;" sai vì vòng lặp chỉ kết thúc khi f đã bằng null, nên lệnh f.next ngay sau đó ném NullPointerException.