2008-08-13 55 views
129

Cách tốt nhất để tạo danh sách liên kết trong Java là gì?Làm cách nào để tạo Cấu trúc dữ liệu danh sách được liên kết trong Java?

+30

Cách tốt nhất để thực hiện một danh sách liên kết là sử dụng được xây dựng trong danh sách liên kết. Không viết lại được xây dựng trong các lớp học. –

+19

câu hỏi này là hợp pháp và rất xây dựng cho các lập trình viên thảo luận – anshulkatta

Trả lời

213

Các giải pháp rõ ràng để các nhà phát triển quen thuộc với Java là sử dụng lớp LinkedList đã cung cấp trong java.util. Tuy nhiên, hãy nói, bạn muốn thực hiện triển khai của riêng mình vì một số lý do. Dưới đây là ví dụ nhanh về danh sách được liên kết chèn một liên kết mới ở đầu danh sách, xóa từ đầu danh sách và vòng qua danh sách để in các liên kết chứa trong đó. Enhancements để thực hiện này bao gồm làm cho nó một đúp danh sách liên kết, thêm các phương pháp để chènxóa từ giữa hoặc cuối, và bằng cách thêm đượcloại phương pháp là tốt.

Lưu ý: Trong ví dụ, đối tượng Liên kết không thực sự chứa đối tượng Liên kết khác - nextLink thực sự chỉ là tham chiếu đến liên kết khác.

class Link { 
    public int data1; 
    public double data2; 
    public Link nextLink; 

    //Link constructor 
    public Link(int d1, double d2) { 
     data1 = d1; 
     data2 = d2; 
    } 

    //Print Link data 
    public void printLink() { 
     System.out.print("{" + data1 + ", " + data2 + "} "); 
    } 
} 

class LinkList { 
    private Link first; 

    //LinkList constructor 
    public LinkList() { 
     first = null; 
    } 

    //Returns true if list is empty 
    public boolean isEmpty() { 
     return first == null; 
    } 

    //Inserts a new Link at the first of the list 
    public void insert(int d1, double d2) { 
     Link link = new Link(d1, d2); 
     link.nextLink = first; 
     first = link; 
    } 

    //Deletes the link at the first of the list 
    public Link delete() { 
     Link temp = first; 
     if(first == null){ 
     return null; 
     //throw new NoSuchElementException(); // this is the better way. 
     } 
     first = first.nextLink; 
     return temp; 
    } 

    //Prints list data 
    public void printList() { 
     Link currentLink = first; 
     System.out.print("List: "); 
     while(currentLink != null) { 
      currentLink.printLink(); 
      currentLink = currentLink.nextLink; 
     } 
     System.out.println(""); 
    } 
} 

class LinkListTest { 
    public static void main(String[] args) { 
     LinkList list = new LinkList(); 

     list.insert(1, 1.01); 
     list.insert(2, 2.02); 
     list.insert(3, 3.03); 
     list.insert(4, 4.04); 
     list.insert(5, 5.05); 

     list.printList(); 

     while(!list.isEmpty()) { 
      Link deletedLink = list.delete(); 
      System.out.print("deleted: "); 
      deletedLink.printLink(); 
      System.out.println(""); 
     } 
     list.printList(); 
    } 
} 
+7

bạn cũng có thể dễ dàng cải thiện mã này để sử dụng Generics cho kiểu dữ liệu hơn là lưu trữ một int và một đôi. – shsteimer

+49

@shsteimer: khá chắc chắn, nhưng kể từ khi sử dụng khá tốt mã này là để chứng minh kỹ thuật, nó sẽ không giúp được bất cứ ai. Nó sẽ chỉ khuếch tán ý tưởng cơ bản. –

+7

Nó không phải là cách tiếp cận OO tốt để có 'liên kết công khai nextLink' và hoạt động trên nó bên ngoài lớp học. Nó có thể được tôn trọng khi 'Link' sẽ là một lớp bên trong của' LinkList'. Đó là một loạt các mã được viết như Java chỉ là một phiên bản-of-c. – Bart

54

Java có triển khai LinkedList mà bạn có thể muốn xem. Bạn có thể tải xuống JDK và nguồn của nó tại java.sun.com.

+0

Danh sách liên kết của Java có cho phép bạn chèn và loại bỏ các phần tử ở các vị trí tùy ý không? –

+8

Đó không phải là toàn bộ điểm của một danh sách liên kết? – jrockway

+1

@Seun Osewa nếu bạn muốn thêm tại một vị trí tùy ý xin sử dụng một ArrayList :) – headgrowe

9

Tốt hơn rất nhiều khi sử dụng java.util.LinkedList, vì nó có thể được tối ưu hóa hơn nhiều so với cách bạn sẽ viết.

+14

Và nó sẽ làm việc lần đầu tiên. –

17

Danh sách được liên kết ở trên hiển thị theo hướng ngược lại. Tôi nghĩ rằng việc thực hiện đúng phương pháp chèn nên

public void insert(int d1, double d2) { 
    Link link = new Link(d1, d2); 

    if(first==null){ 
     link.nextLink = null; 
     first = link; 
     last=link; 
    } 
    else{ 
     last.nextLink=link; 
     link.nextLink=null; 
     last=link; 
    } 
} 
+1

Thêm mới ở cuối trừ khi có quy định khác. :-) –

7
//slightly improved code without using collection framework 

package com.test; 

public class TestClass { 

    private static Link last; 
    private static Link first; 

    public static void main(String[] args) { 

     //Inserting 
     for(int i=0;i<5;i++){ 
      Link.insert(i+5); 
     } 
     Link.printList(); 

     //Deleting 
     Link.deletefromFirst(); 
     Link.printList(); 
    } 


    protected static class Link { 
     private int data; 
     private Link nextlink; 

     public Link(int d1) { 
      this.data = d1; 
     } 

     public static void insert(int d1) { 
      Link a = new Link(d1); 
      a.nextlink = null; 
      if (first != null) { 
       last.nextlink = a; 
       last = a; 
      } else { 
       first = a; 
       last = a; 
      } 
      System.out.println("Inserted -:"+d1); 
     } 

     public static void deletefromFirst() { 
      if(null!=first) 
      { 
       System.out.println("Deleting -:"+first.data); 
       first = first.nextlink; 
      } 
      else{ 
       System.out.println("No elements in Linked List"); 
      } 
     } 

     public static void printList() { 
      System.out.println("Elements in the list are"); 
      System.out.println("-------------------------"); 
      Link temp = first; 
      while (temp != null) { 
       System.out.println(temp.data); 
       temp = temp.nextlink; 
      } 
     } 
    } 
} 
Các vấn đề liên quan