Вставка узлов в Связанный список

#java #nodes

Вопрос:

У меня есть метод вставки, который вставляет узел в связанный список. Проблема в том, что каждый раз, когда добавляется узел, недавно добавленный узел становится головным узлом и теряет узлы до него. Как сохранить значение головного узла и связать его со следующими узлами, которые будут добавлены?

Вот код

     private Node<D> startOfNode;
    private Node<D> endOfNode;  

    public void insert(D data) throws ListOverflowException {
    Node<D> head = new Node<>(data);
    startOfNode = head;

    if (head.getData() != null) {
        Node<D> node1 = new Node<>(data);
        head.setNext(node1);
        endOfNode = node1;
    }
}
 

Я использую этот метод печати:

 public void printList() {
    Node<D> curr = startOfNode;
    int counter = 0;

    while(curr!=null) {
        System.out.println("Item "   counter   " :"   curr.getData());
        curr = curr.getNext();
        counter  ;
    }
    System.out.println("Item "   counter   " :"   null);
}
 

Оба эти метода принадлежат к одному и тому же классу. Я использую класс tester и создаю экземпляр указанного класса.

Когда я пытаюсь добавить два узла со значениями 20 и 30, я получаю следующий результат:
Пункт 0 :30
Пункт 1 :30

Но это должно быть:
Пункт 0 :20
Пункт 1 :30

Комментарии:

1. как вы печатаете список?

Ответ №1:

Вы сбрасываете заголовок каждый раз, когда добавляете данные в свой метод вставки.

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

Или вы можете перейти к конечному узлу и прикрепить новый узел с переданным значением.

Простой способ сделать это показан ниже:

 private Node head;
private Node tail; 

public void insert(int data){
    Node newNode = new Node(data); //Create
        
    if(tail != null) { //Link
        tail.next = newNode;
    }       
        
    if(head == null) {  //Update head.
        head = newNode;
    }
        
    tail = newNode;  //Update tail.
}
 

Ответ №2:

Вы не должны сбрасывать головку во время вставки. Приведенный ниже код должен работать должным образом:

     private Node<D> startOfNode;
    private Node<D> endOfNode;  

    public void insert(D data) throws ListOverflowException {
    iterator = startOfNode;
     
    if(iterator == null) {
    startOfNode = new Node<D>(data);
    endOfNode = startOfNode;
    return;
    }
    while(iterator.getNext() != null) {
        iterator = iteartor.getNext()
       }
   Node<D> end = new Node<>(data);
   iterator.setNext(end);
   endOfNode = end;
   }