Création d'une classe LinkedList à partir de zéro


On nous a confié la tâche de créer une liste de liens à partir de zéro, et il n'y a absolument aucune lecture donnée pour nous guider sur cette tâche à l'origine de migrane. De plus, tout en ligne semble simplement utiliser les méthodes LinkedList intégrées de Java et d'autres choses. Quoi qu'il en soit, les listes liées ont un sens parfait lors de l'utilisation des éléments par défaut de Java, mais leur création à partir de zéro n'a aucun sens. Disons que j'ai

public class LinkedList {
  private LinkedList next;  
  private final String word;
  // constructor
  public LinkedList(String word, LinkedList next) {
    this.word = word;
    this.next = next;
  }

Et donc magiquement nous avons une liste chaînée. Ce qui se passe? Comment ai-je créé un lien liste comme ça? Comment cela fonctionne? Je suis censé écrire une méthode append qui ajoute un paramètre String word donné à la fin de this linkedlist. J'ai essayé de regarder la méthode intégrée addLast pour la classe java linkedlist intégrée, mais cela ne m'aide pas, car je ne comprends vraiment pas ce qui se passe. Quelqu'un se soucie de m'aider:)

Author: Snowman, 2010-11-01

12 answers

Si vous construisez réellement un vrai système, alors oui, vous utiliseriez généralement simplement les éléments de la bibliothèque standard si ce dont vous avez besoin y est disponible. Cela dit, ne considérez pas cela comme un exercice inutile. Il est bon de comprendre comment les choses fonctionnent, et la compréhension des listes chaînées est une étape importante vers la compréhension de structures de données plus complexes, dont beaucoup n'existent pas dans les bibliothèques standard.

Il y a quelques différences entre la façon dont vous créez une liste chaînée et la façon dont l'API Java collections le fait. L'API Collections essaie d'adhérer à une interface plus compliquée. La liste chaînée de l'API Collections est également une liste doublement chaînée, pendant que vous créez une liste chaînée unique. Ce que vous faites est plus approprié pour un devoir de classe.

Votre LinkedList classe, une instance sera toujours une liste d'au moins un élément. Avec ce type de configuration, vous utiliseriez null lorsque vous avez besoin d'une liste vide.

Pensez à next comme étant "le reste de la liste". En fait, de nombreuses implémentations similaires utilisent le nom " tail "au lieu de"next".

Voici un schéma d'un LinkedList contenant 3 éléments:

liste liée diagramme

Notez que c'est un LinkedList objet pointant vers un mot ("Hello") et une liste de 2 éléments. La liste de 2 éléments a un mot ("Pile") et une liste de 1 élément. Cette liste de 1 élément a un mot ("Overflow") et une liste vide (null). Vous pouvez donc traiter next comme une autre liste qui se trouve être un élément plus court.

Vous pouvez ajouter un autre constructeur qui prend juste une chaîne et définit à côté de null. Ce serait pour créer une liste à 1 élément.

Pour ajouter, vous vérifiez si next est null. Si c'est le cas, créez une nouvelle liste d'éléments et définissez next sur cela.

next = new LinkedList(word);

Si next n'est pas null, ajoutez à la place next.

next.append(word);

C'est l'approche récursive, qui est la moindre quantité de code. Vous pouvez transformer cela en une solution itérative qui serait plus efficace en Java*, et ne risquerait pas un débordement de pile avec de très longues listes, mais je suppose que le niveau de complexité n'est pas nécessaire pour votre affectation.


* Certaines langues ont l'élimination des appels tail, qui est une optimisation qui permet à l'implémentation du langage de convertir les "appels tail" (un appel à une autre fonction comme toute dernière étape avant de revenir) en (effectivement) un "goto". Cela fait qu'un tel code évite complètement d'utiliser la pile, ce qui le rend plus sûr (vous ne peut pas déborder la pile si vous n'utilisez pas la pile) et généralement plus efficace. Scheme est probablement l'exemple le plus connu d'un langage avec cette fonctionnalité.

 40
Author: Laurence Gonsalves, 2018-01-26 18:02:11

Ce que vous avez codé n'est pas un LinkedList, du moins pas un que je reconnais. Pour cette tâche, vous voulez créer deux classes:

LinkNode
LinkedList

Un LinkNode a un champ membre pour les données qu'il contient, et une référence LinkNode au LinkNode suivant dans le LinkedList. Oui, c'est une structure de données auto-référentielle. Un LinkedList a juste un spécial LinkNode fait référence au premier élément de la liste.

Lorsque vous ajoutez un article dans le LinkedList, vous traversez tous les LinkNode's jusqu'à ce que vous atteindre le dernier. Ce LinkNode's suivant devrait être null. Vous construisez ensuite un nouveau LinkNode ici, définissez sa valeur et ajoutez-le au LinkedList.

public class LinkNode { 

    String data;
    LinkNode next;

    public LinkNode(String item) { 

       data = item;

    }

}

public class LinkedList { 

    LinkNode head;

    public LinkedList(String item) { 

       head = new LinkNode(item);

    }

    public void add(String item) { 

       //pseudo code: while next isn't null, walk the list
       //once you reach the end, create a new LinkNode and add the item to it.  Then
       //set the last LinkNode's next to this new LinkNode

    }


}
 23
Author: Amir Afghani, 2014-05-02 00:14:22

Que diriez-vous d'une implémentation entièrement fonctionnelle d'une liste chaînée non récursive?

J'ai créé ceci pour mes algorithmes que je classe comme un tremplin pour mieux comprendre avant de passer à l'écriture d'une classe de file d'attente doublement liée pour une affectation.

Voici le code:

import java.util.Iterator;
import java.util.NoSuchElementException;

public class LinkedList<T> implements Iterable<T> {
    private Node first;
    private Node last;
    private int N;

    public LinkedList() {
        first = null;
        last = null;
        N = 0;
    }

    public void add(T item) {
        if (item == null) { throw new NullPointerException("The first argument for addLast() is null."); }
        if (!isEmpty()) {
            Node prev = last;
            last = new Node(item, null);
            prev.next = last;
        }
        else {
            last = new Node(item, null);
            first = last;
        }
        N++;
    }

    public boolean remove(T item) {
        if (isEmpty()) { throw new IllegalStateException("Cannot remove() from and empty list."); }
        boolean result = false;
        Node prev = first;
        Node curr = first;
        while (curr.next != null || curr == last) {
            if (curr.data.equals(item)) {
                // remove the last remaining element
                if (N == 1) { first = null; last = null; }
                // remove first element
                else if (curr.equals(first)) { first = first.next; }
                // remove last element
                else if (curr.equals(last)) { last = prev; last.next = null; }
                // remove element
                else { prev.next = curr.next; }
                N--;
                result = true;
                break;
            }
            prev = curr;
            curr = prev.next;
        }
        return result;
    }

    public int size() {
        return N;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    private class Node {
        private T data;
        private Node next;

        public Node(T data, Node next) {
            this.data = data;
            this.next = next;
        }
    }

    public Iterator<T> iterator() { return new LinkedListIterator(); }

    private class LinkedListIterator implements Iterator<T> {
        private Node current = first;

        public T next() {
            if (!hasNext()) { throw new NoSuchElementException(); }
            T item = current.data;
            current = current.next;
            return item;
        }

        public boolean hasNext() { return current != null; }

        public void remove() { throw new UnsupportedOperationException(); }
    }

    @Override public String toString() {
        StringBuilder s = new StringBuilder();
        for (T item : this)
            s.append(item + " ");
        return s.toString();
    }

    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        while(!StdIn.isEmpty()) {
            String input = StdIn.readString();
            if (input.equals("print")) { StdOut.println(list.toString()); continue; }
            if (input.charAt(0) == ('+')) { list.add(input.substring(1)); continue; }
            if (input.charAt(0) == ('-')) { list.remove(input.substring(1)); continue; }
            break;
        }
    }
}

Remarque: C'est une implémentation assez basique d'une liste à liens uniques. Le type ' T ' est un espace réservé de type générique. Fondamentalement, cette liste chaînée devrait fonctionner avec n'importe quel type qui hérite de l'Objet. Si vous l'utilisez pour les types primitifs assurez-vous d'utiliser la classe nullable équivalents (ex 'Integer' pour l'int type). La' dernière ' variable n'est pas vraiment nécessaire sauf qu'elle raccourcit les insertions à O(1) time. Les suppressions sont lentes car elles s'exécutent en temps O (N), mais elles vous permettent de supprimer la première occurrence d'une valeur dans la liste.

Si vous le souhaitez, vous pouvez également envisager d'implémenter:

  • addFirst() - ajouter un nouvel élément au début de la LinkedList
  • removeFirst () - supprime le premier élément de la LinkedList
  • removeLast () - supprime le dernier élément de la LinkedList
  • addAll () - ajouter une liste / tableau d'éléments à la LinkedList
  • removeAll () - supprime une liste/tableau d'éléments de la LinkedList
  • contains () - vérifiez si la LinkedList contient un élément
  • contient() - effacer tous les éléments de la LinkedList

Honnêtement, il ne faut que quelques lignes de code pour faire cette double liste chaînée. La principale différence entre cela et une liste doublement liée est que les instances de nœud d'une liste doublement liée nécessitent une référence supplémentaire pointant vers l'élément précédent de la liste.

L'avantage de cela par rapport à une implémentation récursive est qu'elle est plus rapide et que vous n'avez pas à vous soucier d'inonder la pile lorsque vous parcourez de grandes listes.

Il y a 3 commandes pour tester cela dans le débogueur/console:

  • Préfixer une valeur par un '+'l'ajoutera à la liste.
  • Préfixer avec un '-' supprimera la première occurrence de la liste.
  • Taper 'print' imprimera la liste avec les valeurs séparées par des espaces.

Si vous n'avez jamais vu les éléments internes de l'un de ces travaux, je vous suggère de parcourir ce qui suit dans le débogueur:

  • add () - pointe un nouveau nœud sur la fin ou initialise les premières/dernières valeurs si la liste est vide
  • remove () - parcourt la liste à partir du du début à la fin. S'il trouve une correspondance, il supprime cet élément et relie les liens rompus entre les liens précédents et suivants de la chaîne. Des exceptions spéciales sont ajoutées lorsqu'il n'y a pas de lien précédent ou suivant.
  • toString() - utilise l'itérateur foreach pour simplement parcourir la chaîne de liste du début à la fin.

Bien qu'il existe des approches meilleures et plus efficaces pour les listes comme les listes de tableaux, comprendre comment l'application traverse via des références / pointeurs fait partie intégrante de comprendre combien de structures de données de niveau supérieur fonctionnent.

 11
Author: Evan Plaice, 2015-05-14 22:07:29

Astuce 1: lisez la description des listes chaînées à http://en.wikipedia.org/wiki/Linked_list

Astuce 2: l'implémentation Java de LinkedList est une liste doublement chaînée. Le vôtre est une liste unique liée. Les algorithmes ne s'appliquent pas directement.


Aussi:

... mais créer [une classe de liste chaînée] à partir de zéro n'a aucun sens.

Cela dépend du résultat requis du travail. Si l'objectif est de produire du code qui répond certaines exigences fonctionnelles / non fonctionnelles, alors vous avez raison. Si l'objectif real est de apprendre comment programmer / concevoir des API / implémenter des structures de données non triviales, alors l'utilité du produit final est presque entièrement hors de propos.

Et donc magiquement nous avons une liste chaînée

Ce que vous avez réellement, il y a un type de données ouvertes, qui pourrait être utilisé pour construire une (sorte de) liste. Mais ce n'est pas ce que votre professeur veut. Et il ne serait certainement pas considéré comme une abstraction de liste utile . Une abstraction utile comprendrait:

  • Méthodes pour faire les choses que les programmeurs ne veulent pas avoir à répéter encore et encore, et

  • Une couche d'abstraction qui empêche les programmeurs de "casser" la liste; par exemple en créant accidentellement un cycle ou en coupant accidentellement une sous-liste dans deux listes pour créer une arborescence inversée.

 8
Author: Stephen C, 2016-04-17 01:25:18

Bien sûr, une liste chaînée est un peu déroutante pour la programmation de n00bs, à peu près la tentation est de la regarder comme des poupées russes, parce que c'est ce que cela ressemble, un Objet LinkedList dans un Objet LinkedList. Mais c'est une touche difficile à visualiser, regardez-la plutôt comme un ordinateur.

LinkedList = Données + Membre suivant

Où c'est le dernier membre de la liste si next est NULL

Donc une liste de 5 membres serait:

LinkedList(Data1, LinkedList(Data2, LinkedList(Data3, LinkedList(Données4, LinkedList(Data5, NULL)))))

Mais vous pouvez le considérer comme simplement:

Data1 -> 2 -> Data3 -> Data4 -> Data5 -> NULL

Alors, comment trouver la fin de cela? Eh bien, nous savons que le NULL est la fin donc:

public void append(LinkedList myNextNode) {
  LinkedList current = this; //Make a variable to store a pointer to this LinkedList
  while (current.next != NULL) { //While we're not at the last node of the LinkedList
    current = current.next; //Go further down the rabbit hole.
  }
  current.next = myNextNode; //Now we're at the end, so simply replace the NULL with another Linked List!
  return; //and we're done!
}

C'est un code très simple bien sûr, et il boucle infiniment si vous lui alimentez une liste circulairement liée! Mais c'est l'essentiel.

 5
Author: OmnipotentEntity, 2010-11-01 05:19:19

Programme de liste chaînée avec les fonctionnalités suivantes

1 Insert At Start
2 Insert At End
3 Insert At any Position
4 Delete At any Position
5 Display 
6 Get Size
7 Empty Status
8 Replace data at given postion
9 Search Element by position
10 Delete a Node by Given Data
11 Search Element Iteratively
12 Search Element Recursively




 package com.elegant.ds.linkedlist.practice;

import java.util.Scanner;

class Node {

    Node link = null;
    int data = 0;

    public Node() {
        link = null;
        data = 0;
    }

    public Node(int data, Node link) {
        this.data = data;
        this.link = null;
    }

    public Node getLink() {
        return link;
    }

    public void setLink(Node link) {
        this.link = link;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

}

class SinglyLinkedListImpl {

    Node start = null;
    Node end = null;
    int size = 0;

    public SinglyLinkedListImpl() {
        start = null;
        end = null;
        size = 0;
    }

    public void insertAtStart(int data) {
        Node nptr = new Node(data, null);
        if (start == null) {
            start = nptr;
            end = start;
        } else {
            nptr.setLink(start);
            start = nptr;
        }
        size++;
    }

    public void insertAtEnd(int data) {
        Node nptr = new Node(data, null);
        if (start == null) {
            start = nptr;
            end = nptr;
        } else {
            end.setLink(nptr);
            end = nptr;
        }
        size++;
    }

    public void insertAtPosition(int position, int data) {
        Node nptr = new Node(data, null);
        Node ptr = start;
        position = position - 1;
        for (int i = 1; i < size; i++) {
            if (i == position) {
                Node temp = ptr.getLink();
                ptr.setLink(nptr);
                nptr.setLink(temp);
                break;
            }
            ptr = ptr.getLink();
        }
        size++;
    }

    public void repleaceDataAtPosition(int position, int data) {
        if (start == null) {
            System.out.println("Empty!");
            return;
        }

        Node ptr = start;
        for (int i = 1; i < size; i++) {
            if (i == position) {
                ptr.setData(data);
            }
            ptr = ptr.getLink();
        }
    }

    public void deleteAtPosition(int position) {
        if (start == null) {
            System.out.println("Empty!");
            return;
        }

        if (position == size) {
            Node startPtr = start;
            Node endPtr = start;
            while (startPtr != null) {
                endPtr = startPtr;
                startPtr = startPtr.getLink();
            }
            end = endPtr;
            end.setLink(null);
            size--;
            return;
        }

        Node ptr = start;
        position = position - 1;
        for (int i = 1; i < size; i++) {

            if (i == position) {
                Node temp = ptr.getLink();
                temp = temp.getLink();
                ptr.setLink(temp);
                break;
            }
            ptr = ptr.getLink();
        }
        size--;
    }

    public void deleteNodeByGivenData(int data) {
        if (start == null) {
            System.out.println("Empty!");
            return;
        }

        if (start.getData() == data && start.getLink() == null) {
            start = null;
            end = null;
            size--;
            return;
        }

        if (start.getData() == data && start.getLink() != null) {
            start = start.getLink();
            size--;
            return;
        }

        if (end.getData() == data) {
            Node startPtr = start;
            Node endPtr = start;

            startPtr = startPtr.getLink();
            while (startPtr.getLink() != null) {
                endPtr = startPtr;
                startPtr = startPtr.getLink();
            }
            end = endPtr;
            end.setLink(null);
            size--;
            return;
        }

        Node startPtr = start;
        Node prevLink = startPtr;
        startPtr = startPtr.getLink();
        while (startPtr.getData() != data && startPtr.getLink() != null) {
            prevLink = startPtr;
            startPtr = startPtr.getLink();
        }
        if (startPtr.getData() == data) {
            Node temp = prevLink.getLink();
            temp = temp.getLink();
            prevLink.setLink(temp);
            size--;
            return;
        }

        System.out.println(data + " not found!");
    }

    public void disply() {
        if (start == null) {
            System.out.println("Empty!");
            return;
        }

        if (start.getLink() == null) {
            System.out.println(start.getData());
            return;
        }

        Node ptr = start;
        System.out.print(ptr.getData() + "->");
        ptr = start.getLink();
        while (ptr.getLink() != null) {
            System.out.print(ptr.getData() + "->");
            ptr = ptr.getLink();
        }
        System.out.println(ptr.getData() + "\n");
    }

    public void searchElementByPosition(int position) {
        if (position == 1) {
            System.out.println("Element at " + position + " is : " + start.getData());
            return;
        }

        if (position == size) {
            System.out.println("Element at " + position + " is : " + end.getData());
            return;
        }

        Node ptr = start;
        for (int i = 1; i < size; i++) {
            if (i == position) {
                System.out.println("Element at " + position + " is : " + ptr.getData());
                break;
            }
            ptr = ptr.getLink();
        }
    }

    public void searchElementIteratively(int data) {

        if (isEmpty()) {
            System.out.println("Empty!");
            return;
        }

        if (start.getData() == data) {
            System.out.println(data + " found at " + 1 + " position");
            return;
        }

        if (start.getLink() != null && end.getData() == data) {
            System.out.println(data + " found at " + size + " position");
            return;
        }

        Node startPtr = start;
        int position = 0;
        while (startPtr.getLink() != null) {
            ++position;
            if (startPtr.getData() == data) {
                break;
            }
            startPtr = startPtr.getLink();
        }
        if (startPtr.getData() == data) {
            System.out.println(data + " found at " + position);
            return;
        }

        System.out.println(data + " No found!");
    }

    public void searchElementRecursively(Node start, int data, int count) {

        if (isEmpty()) {
            System.out.println("Empty!");
            return;
        }
        if (start.getData() == data) {
            System.out.println(data + " found at " + (++count));
            return;
        }
        if (start.getLink() == null) {
            System.out.println(data + " not found!");
            return;
        }
        searchElementRecursively(start.getLink(), data, ++count);
    }

    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return start == null;
    }
}

public class SinglyLinkedList {

    @SuppressWarnings("resource")
    public static void main(String[] args) {
        SinglyLinkedListImpl listImpl = new SinglyLinkedListImpl();
        System.out.println("Singly Linked list : ");
        boolean yes = true;
        do {
            System.out.println("1 Insert At Start :");
            System.out.println("2 Insert At End :");
            System.out.println("3 Insert At any Position :");
            System.out.println("4 Delete At any Position :");
            System.out.println("5 Display :");
            System.out.println("6 Get Size");
            System.out.println("7 Empty Status");
            System.out.println("8 Replace data at given postion");
            System.out.println("9 Search Element by position ");
            System.out.println("10 Delete a Node by Given Data");
            System.out.println("11 Search Element Iteratively");
            System.out.println("12 Search Element Recursively");
            System.out.println("13 Exit :");
            Scanner scanner = new Scanner(System.in);
            int choice = scanner.nextInt();
            switch (choice) {
            case 1:
                listImpl.insertAtStart(scanner.nextInt());
                break;

            case 2:
                listImpl.insertAtEnd(scanner.nextInt());
                break;

            case 3:
                int position = scanner.nextInt();
                if (position <= 1 || position > listImpl.getSize()) {
                    System.out.println("invalid position!");
                } else {
                    listImpl.insertAtPosition(position, scanner.nextInt());
                }
                break;

            case 4:
                int deletePosition = scanner.nextInt();
                if (deletePosition <= 1 || deletePosition > listImpl.getSize()) {
                    System.out.println("invalid position!");
                } else {
                    listImpl.deleteAtPosition(deletePosition);
                }
                break;

            case 5:
                listImpl.disply();
                break;

            case 6:
                System.out.println(listImpl.getSize());
                break;

            case 7:
                System.out.println(listImpl.isEmpty());
                break;

            case 8:
                int replacePosition = scanner.nextInt();
                if (replacePosition < 1 || replacePosition > listImpl.getSize()) {
                    System.out.println("Invalid position!");
                } else {
                    listImpl.repleaceDataAtPosition(replacePosition, scanner.nextInt());
                }
                break;

            case 9:
                int searchPosition = scanner.nextInt();
                if (searchPosition < 1 || searchPosition > listImpl.getSize()) {
                    System.out.println("Invalid position!");
                } else {
                    listImpl.searchElementByPosition(searchPosition);
                }
                break;

            case 10:
                listImpl.deleteNodeByGivenData(scanner.nextInt());
                break;

            case 11:
                listImpl.searchElementIteratively(scanner.nextInt());
                break;

            case 12:
                listImpl.searchElementRecursively(listImpl.start, scanner.nextInt(), 0);
                break;

            default:
                System.out.println("invalid choice");
                break;
            }
        } while (yes);
    }
}

, Il vous aidera dans la liste chaînée.

 4
Author: Vpn_talent, 2017-05-02 10:41:25

Liste chaînée pour démontrer les opérations Insérer Avant, Supprimer Avant, Insérer Arrière et Supprimer Arrière en Java:

import java.io.DataInputStream;
import java.io.IOException;


public class LinkedListTest {

public static void main(String[] args) {
    // TODO Auto-generated method stub      
    Node root = null;

    DataInputStream reader = new DataInputStream(System.in);        
    int op = 0;
    while(op != 6){

        try {
            System.out.println("Enter Option:\n1:Insert Front 2:Delete Front 3:Insert Rear 4:Delete Rear 5:Display List 6:Exit");
            //op = reader.nextInt();
            op = Integer.parseInt(reader.readLine());
            switch (op) {
            case 1:
                System.out.println("Enter Value: ");
                int val = Integer.parseInt(reader.readLine());
                root = insertNodeFront(val,root);
                display(root);
                break;
            case 2:
                root=removeNodeFront(root);
                display(root);
                break;
            case 3:
                System.out.println("Enter Value: ");
                val = Integer.parseInt(reader.readLine());
                root = insertNodeRear(val,root);
                display(root);
                break;
            case 4:
                root=removeNodeRear(root);
                display(root);
                break;
            case 5:
                display(root);
                break;
            default:
                System.out.println("Invalid Option");
                break;
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    System.out.println("Exited!!!");
    try {
        reader.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

static Node insertNodeFront(int value, Node root){  
    Node temp = new Node(value);
    if(root==null){
        return temp; // as root or first
    }
    else
    {
        temp.next = root;
        return temp;
    }               
}

static Node removeNodeFront(Node root){
    if(root==null){
        System.out.println("List is Empty");
        return null;
    }
    if(root.next==null){
        return null; // remove root itself
    }
    else
    {
        root=root.next;// make next node as root
        return root;
    }               
}

static Node insertNodeRear(int value, Node root){   
    Node temp = new Node(value);
    Node cur = root;
    if(root==null){
        return temp; // as root or first
    }
    else
    {
        while(cur.next!=null)
        {
            cur = cur.next;
        }
        cur.next = temp;
        return root;
    }               
}

static Node removeNodeRear(Node root){
    if(root==null){
        System.out.println("List is Empty");
        return null;
    }
    Node cur = root;
    Node prev = null;
    if(root.next==null){
        return null; // remove root itself
    }
    else
    {
        while(cur.next!=null)
        {
            prev = cur;
            cur = cur.next;
        }
        prev.next=null;// remove last node
        return root;
    }               
}

static void display(Node root){
    System.out.println("Current List:");
    if(root==null){
        System.out.println("List is Empty");
        return;
    }
    while (root!=null){
        System.out.print(root.val+"->");
        root=root.next;
    }
    System.out.println();
}

static class Node{
    int val;
    Node next;
    public Node(int value) {
        // TODO Auto-generated constructor stub
        val = value;
        next = null;
    }
}
}
 3
Author: ShivBuyya, 2015-12-23 08:15:28

Comment ai-je créé une liste de liens comme celle-ci. Comment cela fonctionne? C'est tout ce qu'une liste chaînée est. Un article avec un lien vers l'élément suivant de la liste. Tant que vous conservez une référence à l'élément au début de la liste, vous pouvez parcourir le tout en utilisant chaque référence suivante à la valeur suivante.

Pour ajouter, tout ce que vous devez faire est de trouver la fin de la liste, et faire le prochain élément de la valeur ajoutée, donc, si cette non nulle suivant, vous devez appeler ajouter sur l'élément suivant jusqu'à ce que vous trouver la fin de la liste.

this.next.Append(word);
 1
Author: Kevin Stricker, 2010-11-01 05:05:20

Vient de faire un essentiel sur github implémentant LinkedList à partir de zéro. Peut aider. Check it out.

Https://gist.github.com/akshaynagpal/14ee8b54cd018bd05b2a3c2432c818dc

 1
Author: akshaynagpal, 2016-06-20 20:17:55

Veuillez lire cet article: Comment Implémenter une Classe LinkedList À partir de Zéro En Java

package com.crunchify.tutorials;

/**
 * @author Crunchify.com
 */

public class CrunchifyLinkedListTest {

    public static void main(String[] args) {
        CrunchifyLinkedList lList = new CrunchifyLinkedList();

        // add elements to LinkedList
        lList.add("1");
        lList.add("2");
        lList.add("3");
        lList.add("4");
        lList.add("5");

        /*
         * Please note that primitive values can not be added into LinkedList
         * directly. They must be converted to their corresponding wrapper
         * class.
         */

        System.out.println("lList - print linkedlist: " + lList);
        System.out.println("lList.size() - print linkedlist size: " + lList.size());
        System.out.println("lList.get(3) - get 3rd element: " + lList.get(3));
        System.out.println("lList.remove(2) - remove 2nd element: " + lList.remove(2));
        System.out.println("lList.get(3) - get 3rd element: " + lList.get(3));
        System.out.println("lList.size() - print linkedlist size: " + lList.size());
        System.out.println("lList - print linkedlist: " + lList);
    }
}

class CrunchifyLinkedList {
    // reference to the head node.
    private Node head;
    private int listCount;

    // LinkedList constructor
    public CrunchifyLinkedList() {
        // this is an empty list, so the reference to the head node
        // is set to a new node with no data
        head = new Node(null);
        listCount = 0;
    }

    public void add(Object data)
    // appends the specified element to the end of this list.
    {
        Node crunchifyTemp = new Node(data);
        Node crunchifyCurrent = head;
        // starting at the head node, crawl to the end of the list
        while (crunchifyCurrent.getNext() != null) {
            crunchifyCurrent = crunchifyCurrent.getNext();
        }
        // the last node's "next" reference set to our new node
        crunchifyCurrent.setNext(crunchifyTemp);
        listCount++;// increment the number of elements variable
    }

    public void add(Object data, int index)
    // inserts the specified element at the specified position in this list
    {
        Node crunchifyTemp = new Node(data);
        Node crunchifyCurrent = head;
        // crawl to the requested index or the last element in the list,
        // whichever comes first
        for (int i = 1; i < index && crunchifyCurrent.getNext() != null; i++) {
            crunchifyCurrent = crunchifyCurrent.getNext();
        }
        // set the new node's next-node reference to this node's next-node
        // reference
        crunchifyTemp.setNext(crunchifyCurrent.getNext());
        // now set this node's next-node reference to the new node
        crunchifyCurrent.setNext(crunchifyTemp);
        listCount++;// increment the number of elements variable
    }

    public Object get(int index)
    // returns the element at the specified position in this list.
    {
        // index must be 1 or higher
        if (index <= 0)
            return null;

        Node crunchifyCurrent = head.getNext();
        for (int i = 1; i < index; i++) {
            if (crunchifyCurrent.getNext() == null)
                return null;

            crunchifyCurrent = crunchifyCurrent.getNext();
        }
        return crunchifyCurrent.getData();
    }

    public boolean remove(int index)
    // removes the element at the specified position in this list.
    {
        // if the index is out of range, exit
        if (index < 1 || index > size())
            return false;

        Node crunchifyCurrent = head;
        for (int i = 1; i < index; i++) {
            if (crunchifyCurrent.getNext() == null)
                return false;

            crunchifyCurrent = crunchifyCurrent.getNext();
        }
        crunchifyCurrent.setNext(crunchifyCurrent.getNext().getNext());
        listCount--; // decrement the number of elements variable
        return true;
    }

    public int size()
    // returns the number of elements in this list.
    {
        return listCount;
    }

    public String toString() {
        Node crunchifyCurrent = head.getNext();
        String output = "";
        while (crunchifyCurrent != null) {
            output += "[" + crunchifyCurrent.getData().toString() + "]";
            crunchifyCurrent = crunchifyCurrent.getNext();
        }
        return output;
    }

    private class Node {
        // reference to the next node in the chain,
        // or null if there isn't one.
        Node next;
        // data carried by this node.
        // could be of any type you need.
        Object data;

        // Node constructor
        public Node(Object dataValue) {
            next = null;
            data = dataValue;
        }

        // another Node constructor if we want to
        // specify the node to point to.
        public Node(Object dataValue, Node nextValue) {
            next = nextValue;
            data = dataValue;
        }

        // these methods should be self-explanatory
        public Object getData() {
            return data;
        }

        public void setData(Object dataValue) {
            data = dataValue;
        }

        public Node getNext() {
            return next;
        }

        public void setNext(Node nextValue) {
            next = nextValue;
        }
    }
}

Sortie

lList - print linkedlist: [1][2][3][4][5]
lList.size() - print linkedlist size: 5
lList.get(3) - get 3rd element: 3
lList.remove(2) - remove 2nd element: true
lList.get(3) - get 3rd element: 4
lList.size() - print linkedlist size: 4
lList - print linkedlist: [1][3][4][5]
 0
Author: d.danailov, 2015-09-17 18:31:47

Moyens trouver ci-dessous Programme

class Node {
    int data;
    Node next;

    public Node(int data) {
        this.data = data;
        this.next = null;
    }
}

public class LinkedListManual {

    Node node;

    public void pushElement(int next_node) {
        Node nd = new Node(next_node);
        nd.next = node;
        node = nd;
    }

    public int getSize() {
        Node temp = node;
        int count = 0;
        while (temp != null) {
            count++;
            temp = temp.next;
        }
        return count;
    }

    public void getElement() {
        Node temp = node;
        while (temp != null) {
            System.out.println(temp.data);
            temp = temp.next;
        }
    }

    public static void main(String[] args) {
        LinkedListManual obj = new LinkedListManual();
        obj.pushElement(1);
        obj.pushElement(2);
        obj.pushElement(3);
        obj.getElement(); //get element
        System.out.println(obj.getSize());  //get size of link list
    }

}
 0
Author: MAnoj Sarnaik, 2018-07-23 13:43:48
class Node
{
  int data;
     Node link;

     public Node()
     {
         data=0;
         link=null;
        }

     Node ptr,start,temp;

    void create()throws  IOException
     {
         int n;
         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
         System.out.println("Enter first data");
         this.data=Integer.parseInt(br.readLine());
         ptr=this;
         start=ptr;
         char ins ='y';
         do
         {
             System.out.println("Wanna Insert another node???");
             ins=(char)br.read();
             br.read();
             if(ins=='y')
             {
                 temp=new Node();
                 System.out.println("Enter next data");
                 temp.data=Integer.parseInt(br.readLine());
                 temp.link=null;
                 ptr.link=temp;
                 temp=null;
                 ptr=ptr.link;
                }
            }while(ins=='y');
        }

public static void main(String args[])throws IOException
     {
       Node first= new Node();
       first.create();
}
}
 -1
Author: Eadhunath, 2014-10-12 05:55:30