Pourquoi avoir une classe parente pour la liste liée

Sonali Gupta:

Ceci est une question générale, peut-être au sujet de concept de POO. Je commence avec DS implémentation en Java. Je suis en train de mettre en œuvre la liste chaînée et sur tous rsources en ligne, je vois une pratique similaire:

  1. Faire une classe de nœud.
  2. Faire une classe liste chaînée qui a un objet de nœud.

De même, j'ai vu pour la pile, les files d'attente et des arbres. Ma question est, si je mets en œuvre LinkedList en ayant seulement une classe qui ressemble à ci-dessous:

 class LinkList {
     int data;
     LinkList next; }

Je suis encore capable de faire toutes les opérations. Ainsi, le concept d'une seconde classe qui contient une racine ou un en-tête est uniquement à des fins OOP ou autre chose? J'ai écrit le code suivant et il fonctionne bien tous, sans la nécessité d'avoir un pointeur d'en-tête. J'utilise une variable de références dans toutes les méthodes et l'objet de la classe principale conserve encore la trace de la tête.

/* package codechef; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

class LinkList {
    int data;
    LinkList next;

    LinkList(){
        data = 0;
        next = null;
    }

    LinkList(int data) {
        this.data = data;
        next = null;
    }
    LinkList insertAtBegin(int data){
        LinkList newBegin = new LinkList(data);
        newBegin.next = this;
        return newBegin;
    }
    void insertAtPlace(int data, int insertData){
        LinkList newNode = new LinkList(insertData);
        LinkList iterator = this;
        while(iterator!=null && iterator.data!=data){
            iterator = iterator.next;
        }
        if(iterator.data == data)
        {
            newNode.next = iterator.next;
            iterator.next = newNode;
        }
    }
    void insertAtLast(int data) {
        if(next == null){
            next = new LinkList(data);
        }
        else{
            next.insertAtLast(data);
        }
    }

}

/* Name of the class has to be "Main" only if the class is public. */
class Codechef
{
    public static void main (String[] args) throws java.lang.Exception
    {
        // your code goes here
        LinkList linkList = new LinkList(6);
        linkList.insertAtLast(5);
        linkList.insertAtLast(3);
        linkList.insertAtLast(2);
        linkList.insertAtLast(1);

        linkList = linkList.insertAtBegin(10);
        LinkList iterator = linkList;
        while(iterator!=null){
            System.out.print(iterator.data);
            iterator = iterator.next;
        }
        System.out.print("\n");
        linkList.insertAtPlace(5,-1);
        iterator = linkList;
        while(iterator!=null){
            System.out.print(iterator.data);
            iterator = iterator.next;
        }
    }
}
Ils étaient les suivants:

Vous devez garder une trace de la tête de la part de liste chaînée. Sinon, comment voulez-vous itérer sur la liste entière, ou rechercher un élément dans la liste?

Si votre LinkListest essentiellement un noeud (avec des données et référence au noeud suivant), vous devez mettre en œuvre toutes les opérations de liste chaînée (ajout, suppression, etc ...) dans une classe séparée qui garde la trace du nœud de tête du liste.

Cela vous ramène à une classe de liste chaînée qui utilise une classe de noeud.

En ce qui concerne le code que vous avez ajouté, LinkList insertAtBegin(int data)n'insérera un nœud au début de la liste si vous l' appelez sur le premier noeud de la liste. Mais vous a rien de là arrêter de l' appeler sur un noeud de la liste, auquel cas il sera essentiellement renvoyer une nouvelle liste qui commence par les nouveaux éléments et se termine par une sous-liste de la liste originale.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=227010&siteId=1
conseillé
Classement