2011-02-07 30 views
15

Khi sử dụng Java LinkedList làm thế nào để bạn tìm ra mối quan hệ tiếp theo hoặc trước đó của phần tử?Danh sách liên kết Java Util - cách tìm kiếm tiếp theo?

Ý tôi là, trong một danh sách liên kết thường xuyên tôi sẽ làm một cái gì đó như thế này:

Node node1 = new Node(); 
Node node2 = new Node(); 
LinkedList list = new LinkedList(); 
list.add(node1); 
list.add(node2); 

//then my node1 will know who it's next is: 
assertEquals(node2, node1.next()); 

nơi Node là thùng chứa của riêng mình cho dữ liệu/đối tượng.

Nhưng trong Danh sách liên kết của Java, dữ liệu dường như không bị sửa đổi. Vì vậy, làm thế nào để tôi thực sự tìm ra những người "tiếp theo" (hoặc "trước đó" trong trường hợp của các danh sách liên kết gấp đôi) là?

+0

Điều gì sẽ xảy ra nếu tôi đến 'list.add (node1); list.add (node1); '? –

+3

LinkedList của Java là một chút sai lầm gây nhầm lẫn cho những người đã học về "danh sách liên kết". Nó không phải là chỉ gây hiểu nhầm hoặc, ít nhất, điều được đặt tên kém trong Java ("ngoại lệ sửa đổi đồng thời" đến tâm trí quá). Nhưng tất nhiên bạn có thể mong đợi những người uống Java-kool'aid tin rằng mọi thứ mà các vị thần Java tạo ra là hoàn hảo để giải thích tại sao LinkedList thực sự là một danh sách liên kết compi sci và tại sao tôi ngu ngốc và tất cả;) – SyntaxT3rr0r

+2

Có một rất nhiều điều tồi tệ và khủng khiếp trong Java, nhưng cả LinkedList và CME đều khá ổn. Trừ khi bạn muốn đặt tên nó như ListImplementedAsDoubleLinkedList và YouOrSomebodyElseHadModifiedYourCollectionInTheMeantime, tôi không biết đặt tên nó như thế nào. Điều đó nói rằng, tôi đồng ý rằng một cái tên tốt hơn sẽ tốt đẹp, tôi không thể tìm thấy bất kỳ cái gì. – maaartinus

Trả lời

12

Bạn không thể. LinkedList chỉ là một thực hiện của Danh sách và cung cấp về không có gì nhiều hơn nữa. Bạn sẽ cần phải làm của riêng bạn.

Đối với node1.next(), bạn cần tham chiếu từ node1 vào Danh sách. Trên thực tế, bạn cần nhiều tham chiếu, vì node1 có thể có nhiều lần. Hơn nữa, nó có thể được chứa trong nhiều Danh sách.

Có thể bạn có thể sử dụng ListIterator cho việc này.

+3

Đó là khá buồn, như tôi đã hy vọng cho một "danh sách liên kết" thực hiện. À, tôi sẽ tự mình cuộn. – drozzy

+1

@drozzy - cách khác, hãy xem lại những gì bạn đang làm và xem liệu bạn có thể thực hiện tốt hơn nếu bạn không * nghĩ * về các con trỏ 'next' và' prev'. –

+0

Tôi ước, nhưng tôi đang triển khai Cây Phạm vi, đòi hỏi một danh sách liên kết gấp đôi lá của nó. – drozzy

6

Tôi không biết bạn đang sử dụng lớp học nào Node, nhưng LinkedList<T> có lớp nút nội bộ riêng mà bạn không có quyền truy cập. Gọi add sẽ thêm một giá trị vào danh sách - bạn không thể chèn một nút rõ ràng giữ một giá trị hoặc tự truy cập các nút theo bất kỳ cách nào khác. Vâng, đôi khi có thể là một cơn đau.

Nếu bạn cần danh sách được liên kết với đóng gói công khai của nút, bạn sẽ cần phải tìm một triển khai khác hoặc cuộn của riêng bạn.

+0

Xin lỗi, Node là vùng chứa ảo của riêng tôi cho dữ liệu. Tôi sẽ nói LinkedList của java không phù hợp với tôi trong trường hợp này. – drozzy

1

Phần "được liên kết" của tên lớp LinkedList chỉ đề cập đến việc triển khai. Giao diện không hiển thị các phương thức rõ ràng để thực hiện những gì bạn muốn.

LinkedList thực hiện các giao diện Collection (và trong danh sách), vì vậy đưa ra một chỉ số i của một phần tử trong danh sách list, bạn có thể nhận được các yếu tố trước và sau với list.get(i-1)list.get(i+1), tương ứng. Đối với một LinkedList, việc thực hiện các phương thức này khá chậm. Nếu bạn thực hiện nhiều thao tác prev/next, hãy xem xét để thực hiện danh sách của bạn hoặc sử dụng một ArrayList thay thế.

+1

Vâng, rất nhiều cho danh sách "được liên kết". – drozzy

1

Tôi phải không đồng ý với câu trả lời được chấp nhận. Bạn có thể miễn là bạn có phần tử đầu. Khi bạn mất tham chiếu đến phần tử đầu tiên bằng cách xóa và không trả về phần tử tiếp theo hoặc chèn phần tử trước phần tử đầu tiên và không trả về phần tử đó, bạn sẽ không thể thực hiện tìm kiếm của mình.

+0

Điều này không có ý nghĩa với tôi. Để nguyên tố đầu tiên là '" f "', tìm cái tiếp theo sau phần tử '" e "'. – maaartinus

2

Giải pháp tốt nhất: Hãy Liên kết tiếp theo và cuối cùng của riêng bạn khi xây dựng một new List mục Object:

Chỉ cần có một Object lastInserted ở đâu đó trên toàn cầu hơn

public MyLinkedListItem(){ 
    if(lastInserted != null){ 
     lastInserted.next = this; 
     this.last = lastInserted; 
    } 
    lastInserted = this; 
} 
1

Bạn có thể sử dụng một iterator để di chuyển qua các nút như:

Node node1 = new Node(); 
    Node node2 = new Node(); 
    LinkedList list = new LinkedList(); 
    list.add(node1); 
    list.add(node2); 

    Iterator <Node> m_iterator=list.iterator(); 

    //set iterator to first node 
    m_iterator.next(); 

    //then my node1 will know who it's next is: 
    assertEquals(node2, m_iterator.next()); 
Các vấn đề liên quan