2010-06-08 75 views
6

Bản sao có thể xảy ra:
find whether a loop in a linked list without two pointers
How to determine if a linked list has a cycle using only two memory locations.
Best algorithm to test if a linked list has a cycleLàm thế nào để xác định xem một danh sách liên kết có chứa một vòng lặp?

Trong một sự chuẩn bị cho một cuộc phỏng vấn việc làm, tôi gặp phải những câu dưới đây:

Làm thế nào bạn có thể xác định liệu một danh sách liên kết (thuộc bất kỳ loại nào) chứa một vòng lặp, sử dụng additio Nal không gian phức tạp của O (1)? Bạn không thể giả định rằng vòng lặp bắt đầu tại nút đầu tiên (và tất nhiên, vòng lặp không phải chứa tất cả các nút).

Tôi không thể tìm thấy câu trả lời, mặc dù tôi có cảm giác nó khá đơn giản ...

+0

Tôi đã bỏ lỡ câu hỏi chính xác này trong bản phỏng vấn. Tôi chỉ có thể đưa ra giải pháp thời gian và bộ nhớ O (* n *). – Thanatos

+1

Tôi đã học về điều này trong một lớp CS, nhưng tôi không nghĩ đó là một câu hỏi đặc biệt tốt vì nó "chỉ hiển nhiên nếu bạn đã biết". –

+0

Nhiều, nhiều bản sao, ví dụ: [tìm một vòng lặp trong danh sách được liên kết không có hai con trỏ] (http://stackoverflow.com/questions/2338683/find-whether-a-loop-in-a-linked-list-without-two-pointers) –

Trả lời

11

Dễ dàng. Duy trì hai con trỏ vào danh sách. Tại mỗi bước, trước một con trỏ bằng một liên kết duy nhất và chuyển tiếp một con trỏ khác bằng hai liên kết. Kiểm tra xem liệu chúng có trỏ đến cùng một phần tử hay không. Nếu vậy, bạn có một vòng lặp. Nếu không, hãy lặp lại cho đến khi bạn tìm thấy một vòng lặp hoặc bạn đến cuối danh sách.

+11

Tôi thấy rằng giải pháp này chỉ "dễ" nếu bạn biết. Đây là, theo ý kiến ​​của tôi, suy nghĩ khá thông minh. – Thanatos

+0

Thú vị. Tại sao bận tâm tiến bộ khác? –

+0

Bất kỳ liên kết nào cũng có thể bằng bất kỳ liên kết nào khác, vì vậy chúng phải di chuyển xung quanh danh sách để kiểm tra mọi kết hợp (có thể truy cập). – Ether

1

Có lẽ kỹ thuật tương tự như kiểm tra xem biểu đồ có phải là cây không (cây không có chu kỳ), xem this this question. Nó đề nghị hoặc là một loại topo hoặc một tìm kiếm đầu tiên chiều sâu.

-1

Tôi gặp sự cố chính xác này trong mã trực tiếp thực tế vào tuần trước.

Tất cả những gì tôi đã làm được giữ một con trỏ (liên kết) cho phần tử đầu tiên. Sau đó, khi tôi lặp lại qua danh sách, nếu tôi lại có con trỏ đó, tôi biết có một vòng lặp.

+1

Xem nhận xét về câu trả lời được chấp nhận vì sao điều này sẽ không bắt được * tất cả * chu kỳ và tại sao đó là giải pháp tốt hơn. –

+0

Vòng lặp không nhất thiết phải bắt đầu ở phần tử đầu tiên. –

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