Зачем нужен родительский класс для связанного списка - PullRequest
4 голосов
/ 24 июня 2019

Это общий вопрос, может быть, о концепции ООП.Я только начинаю с реализации DS в JAVA.Я пытаюсь реализовать Linked List, и во всех онлайн-ресурсах я вижу похожую практику:

  1. Создание класса узла.
  2. Создайте класс Linked List, в котором есть объект узла.

Точно так же я видел для стека, очередей и деревьев.У меня вопрос, если я реализую LinkedList, имея только один класс, который выглядит ниже:

 class LinkList {
     int data;
     LinkList next; }

Я все еще могу выполнять все операции.Таким образом, концепция наличия второго класса, содержащего корень или заголовок, предназначена только для целей ООП или что-то еще?Я написал следующий код, и он работает все хорошо без необходимости указателя заголовка.Я использую переменную ссылки во всех методах, и объект основного класса по-прежнему следит за головой.

/* 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;
        }
    }
}

Ответы [ 3 ]

3 голосов
/ 24 июня 2019

Вы должны где-то отслеживать заголовок связанного списка.В противном случае, как бы вы перебрали весь список или искали элемент в списке?

Если ваш LinkList по сути является узлом (с данными и ссылкой на следующий узел), вам придетсяреализовать все операции со связанным списком (добавить, удалить и т. д.) в отдельном классе, который отслеживает головной узел списка.

Это возвращает вас к классу связанного списка, в котором используется узелclass.

Что касается добавленного вами кода, LinkList insertAtBegin(int data) будет вставлять узел только в начало списка, если вы вызовете его на первом узле списка.Но ничто не мешает вам вызывать его в любом узле списка, и в этом случае он по существу вернет новый список, который начинается с новых элементов и заканчивается подсписком исходного списка.

1 голос
/ 24 июня 2019

Существует несколько причин иметь два класса:

  • для разграничения понятия списка и отдельного узла,
  • , чтобы избежать неловкого возврата головного узлаиз каждого метода
  • , чтобы клиент не отвечал за отслеживание головного узла,
  • , чтобы скрыть детали реализации, чтобы класс можно было легко заменить.с эквивалентным,
  • и т.д ...
0 голосов
/ 24 июня 2019

Ваш класс LinkList будет просто классом узла в первом примере, потому что он содержит данные и узел, следующий за ним

Общая цель наличия класса LinkedList - иметь «обертку»для списка это просто класс, который содержит заголовок списка (который в случае связанного списка - это список) и, возможно, некоторые функции, такие как функция поиска или что-то еще, что вам понадобится.

так что в вашем случае (2-й пример) это просто класс-оболочка, который реализует некоторые дополнительные функции (insertAtBegin(), insertAtPlace() и insertAtLast())

...