Làm cách nào để tạo Cấu trúc dữ liệu danh sách liên kết trong Java? [đóng cửa]


135

Cách tốt nhất để tạo một danh sách liên kết trong Java là gì?


33
Cách tốt nhất để tạo danh sách liên kết là sử dụng danh sách được liên kết tích hợp. Đừng viết lại được xây dựng trong các lớp.
Peter Lawrey

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

Câu trả lời:


220

Giải pháp rõ ràng cho các nhà phát triển quen thuộc với Java là sử dụng lớp LinkedList đã được cung cấp trong java.util . Nói, tuy nhiên, bạn muốn thực hiện của riêng bạn vì một số lý do. Dưới đây là một 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à lặp qua danh sách để in các liên kết có trong đó. Các cải tiến cho việc triển khai này bao gồm làm cho nó trở thành một danh sách liên kết kép , thêm các phương thức để chènxóa từ giữa hoặc cuối, và bằng cách thêm các phương thức getsort .

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à một 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 tổng quát cho kiểu dữ liệu thay vì lưu trữ int và double.
shsteimer

51
@shsteimer: khá chắc chắn, nhưng vì khá nhiều cách sử dụng tốt mã này là để thể hiện kỹ thuật, nó sẽ không giúp được ai. Nó sẽ chỉ khuếch tán ý tưởng cơ bản.
Joachim Sauer

8
Đó không phải là cách tiếp cận OO tốt để có public Link nextLinkvà hoạt động bên ngoài lớp học. Nó có thể được tôn trọng khi Linksẽ là một lớp nội bộ LinkList. Nó là một nhóm mã khác được viết dưới dạng Java chỉ là một phiên bản khác của c.
Bart

1
Khi bạn Chèn, mục đầu tiên của bạn sẽ không bao giờ có được một Liên kết tiếp theo - trừ khi tôi thiếu một cái gì đó với các tham chiếu Java
Chris S

Làm thế nào tôi có thể thực hiện phương thức xóa (chỉ mục)?
JohnDow

55

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


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

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

2
@Seun Osewa nếu bạn muốn thêm vào một vị trí tùy ý, vui lòng sử dụng một ArrayList :)
headgrowe

3
Thay vì tải xuống JDK để xem triển khai của nó LinkedList, bạn chỉ có thể xem LinkedList.javatrực tuyến tại đây . Trang đó thậm chí cú pháp làm nổi bật mã và hiển thị nội dung các bình luận Javadoc.
Rory O'Kane


17

Danh sách 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 phải là

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 vào cuối trừ khi có quy định khác. :-)

9

Sử dụng java.util.LinkedList tốt hơn nhiều, vì có lẽ nó được tối ưu hóa hơn nhiều so với cái mà bạn sẽ viết.


15
Và nó sẽ hoạt động lần đầu tiên.
Peter Lawrey

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;
            }
        }
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.