Báo cáo vấn đề: Được cung cấp danh sách liên kết vòng tròn, triển khai thực hiện một bản ngã trả về nút ở đầu vòng lặp.Giải mã cuộc phỏng vấn mã hóa, ấn bản lần thứ 6, 2.8
Phím trả lời đưa ra giải pháp phức tạp hơn những gì tôi đề xuất. Có gì sai với tôi ?:
public static Node loopDetection(Node n1) {
ArrayList<Node> nodeStorage = new ArrayList<Node>();
while (n1.next != null) {
nodeStorage.add(n1);
if (nodeStorage.contains(n1.next)) {
return n1;
}
else {
n1 = n1.next;
}
}
return null;
}
Tôi đang bối rối. Trong một danh sách liên kết vòng tròn, bạn sẽ giữ một tham chiếu đến "đầu" của danh sách, và đầu là nút "đầu tiên" trong vòng lặp, do đó, nó là ở đầu vòng lặp, do đó 'trở về đầu' (O (1)). Hoặc nếu tham chiếu duy nhất của bạn là "đuôi" của danh sách, đầu nằm ở "tail.next", một lần nữa là một câu lệnh return đơn giản. – Andreas
@Andreas: Xem xét danh sách A-> B-> C-> D-> E-> C-> D-> E -> ... Sự bắt đầu của vòng lặp là tại C, không A. Và một danh sách liên kết với một vòng lặp không có đuôi. Hãy tưởng tượng lái xe trên đường một chiều vào bùng binh mà không có lối ra nào. – gnasher729
@ gnasher729 Có sự khác biệt giữa danh sách liên kết [* circular *] (https://en.wikipedia.org/wiki/Linked_list#Circular_Linked_list), trong đó nút cuối cùng trỏ trở lại nút đầu tiên và * hỏng * danh sách liên kết không tròn (còn gọi là mở hoặc tuyến tính) với vòng lặp * *. Tôi có thể thấy bây giờ, rằng câu hỏi không thực sự là về một danh sách liên kết * tròn *, nhưng về một danh sách liên kết tuyến tính * bị hỏng *, do đó sự nhầm lẫn ban đầu của tôi. "Tuyên bố vấn đề" bị sai lệch. – Andreas