Як створити структуру даних пов'язаного списку на Java? [зачинено]


135

Який найкращий спосіб скласти зв'язаний список на Java?


33
Найкращий спосіб скласти зв'язаний список - використовувати вбудований зв'язаний список. Не переписуйте побудовані в класи.
Пітер Лорі

21
це питання є законним та дуже конструктивним для обговорення програмістів
anshulkatta

Відповіді:


220

Очевидним рішенням для знайомих Java розробників є використання класу LinkedList, який вже надається в java.util . Скажіть, однак, ви хотіли зробити власну реалізацію чомусь. Ось короткий приклад пов’язаного списку, який вставляє нове посилання на початку списку, видаляє з початку списку та перебирає через список, щоб надрукувати посилання, що містяться в ньому. Вдосконалення цієї реалізації включають в себе створення подвійного зв’язку списку , додавання методів для вставки та видалення із середини чи кінця, а також додавання методів get і sorting .

Примітка . У прикладі об'єкт Посилання насправді не містить іншого об'єкта Посилання - nextLink насправді є лише посиланням на інше посилання.

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
Ви також можете досить легко вдосконалити цей код, щоб використовувати дженерики для типу даних, а не зберігати int та double.
shsteimer

51
@shsteimer: цілком виразно, але, оскільки майже єдиним хорошим використанням цього коду є демонстрація техніки, це нікому не допоможе. Це поширило б лише основну думку.
Йоахім Зауер

8
Недоцільно підхід OO мати public Link nextLinkта працювати над ним поза класом. Це може бути поважно, коли Linkбуде внутрішній клас LinkList. Це ще одна купа коду, написана, оскільки Java була лише іншою версією c.
Барт

1
Коли Ви вставляєте, ваш перший елемент ніколи не отримає наступне посилання - якщо я не пропущу щось із посиланнями на Java
Chris S

Як я можу реалізувати метод видалення (індекс)?
JohnDow

55

У Java є реалізація LinkedList , яку ви хочете перевірити. Ви можете завантажити JDK та його джерела на java.sun.com .


Чи Linkedlist Java не дозволяє вставляти та видаляти елементи у довільних позиціях?
Seun Osewa

10
Хіба це не вся суть пов’язаного списку?
jrockway

2
@Seun Osewa, якщо ви хочете додати у довільному положенні, будь ласка, використовуйте ArrayList :)
headgrowe

3
Замість завантаження JDK для перегляду його реалізації LinkedList, ви можете просто переглянути його LinkedList.javaтут . Ця сторінка навіть підкреслює синтаксис коду і робить коментарі Javadoc вбудованими.
Рорі О'Кайн


17

Наведений вище список відображається у зворотному напрямку. Я думаю, що правильна реалізація методу вставки повинна бути

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
Додайте нове наприкінці, якщо не вказано інше. :-)

9

Набагато краще використовувати java.util.LinkedList, тому що він, ймовірно, набагато оптимізованіший, ніж той, який ви напишете.


15
І це спрацює перший раз.
Пітер Лорі

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;
            }
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.