Как я могу получить следующий указатель моего класса LinkedList без использования встроенной функции?

#java #linked-list #singly-linked-list

#java #связанный список #односвязный список

Вопрос:

Я новичок в программировании, и я практикую язык программирования Java. У меня был тяжелый день в поиске решения моей программы, потому что я не могу получить свой «следующий» указатель, и я действительно хочу напечатать свое последнее значение. Может ли кто-нибудь помочь мне исправить это и объяснить мне? Заранее благодарю вас. Вот мой код.

Примечание: результат моей программы равен 5.

 public class Node {

private int data;
private Node next;

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

public int getData() {
    return this.data;
}

public void setNext(Node n) {
    this.next = n;
}

public Node getNext() {
    return this.next;
}
}

public class LinkedList {

private static Node head, next;

public LinkedList (int data) {
    head = new Node (data);
}

public void addLast(int data) {
    Node n = new Node (data);

    if (head == null) {
        head = n;
    }
    else {
        Node temp = head;
        temp.setNext(next);
        while (temp.getNext() != null) {
            temp = temp.getNext();
        }
        Node t = temp.getNext();
        t = n;
    }
}

public void printList() {

    head.setNext(next);

    while (head.getNext() != null) {
        System.out.println(head.getData());
        head = head.getNext();
    }
    System.out.println(head.getData());
}

public static void main(String[] args) {

    LinkedList l = new LinkedList(5);
    l.addLast(7);
    l.printList();
}
}
  

Ответ №1:

Я предлагаю следующие две поправки к вашему коду.

  1. со следующим блоком else в методе addLast.

          Node temp = head;
         temp.setNext(next); // this line causing the next object to be set to null all the time. commenting this line will help in making sure the follwing loop reaches to end of the list, otherwise the while loop will always exit without any iteration.
         while (temp.getNext() != null) {
             temp = temp.getNext();
         }
         Node t = temp.getNext(); 
         t = n; // this will also not change the linking. Its basically assigned a new value to t.
      

используйте следующее предложение

         Node temp = head;
        while (temp.getNext() != null) {
            temp = temp.getNext();
        }
        // now we reached end of list and temp.next is null.
        // assign newly createdd node to temp.next
        temp.setNext(n);
  
  1. При повторении элемента в printList существует та же проблема, что и в пункте 1. попробуйте использовать следующее предложение для метода printList.
 
      //  head.setNext(next); // This line will always set head.next to null and whole list will be lost. Instead of this use following line
       Node temp = head;
        while (temp.getNext() != null) { // here if you use head its position will move to end. So use temp variable for iteration
            System.out.println(temp.getData());
            temp= temp.getNext();
        }
       System.out.println(temp.getData());
  

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

Ответ №2:

Я внес некоторые поправки, чтобы заставить ваш код работать. Оператор If в вашем методе addLast:

 if (head == null) {
  

является избыточным, поскольку ваш LinkedList может быть инициализирован только путем передачи некоторых данных, следовательно, head никогда не будет нулевым, он всегда будет указывать на узел, содержащий данные

Также строка

 head.setNext(next);
  

в вашем printList() было проблематично, оно всегда указывало на null

 public class LinkedList {

  private static Node head, next;

  public LinkedList(int data) {
    head = new Node(data);
  }

  public void addLast(int data) {
    Node n = new Node(data);
    Node temp = head;
    temp.setNext(next);
    while (temp.getNext() != null) {
      temp = temp.getNext();
    }
    temp.setNext(n);
  }

  public void printList() {
    while (head.getNext() != null) {
      System.out.println(head.getData());
      head = head.getNext();
    }
    System.out.println(head.getData());
  }

  public static void main(String[] args) {
    LinkedList l = new LinkedList(5);
    l.addLast(7);
    l.printList();
  }
}
  

Ответ №3:

TL; DR:

  1. Вы устанавливаете null в качестве следующего узла в своем printList() методе;
  2. Ваш addLast тоже не работает (вы не устанавливаете следующий узел (подробности см. Ниже);
  3. Вы никогда не должны устанавливать узел (или делать какие-либо логические изменения вообще) в своем print методе. Print должен просто печатать, как следует из названия, и он не должен содержать никаких побочных эффектов, изменяющих вашу структуру данных. То есть: вы должны четко разделить свои проблемы.

В вашем текущем addLast вы делаете:

 public void addLast(int data) {
    Node n = new Node (data);

    if (head == null) {
        head = n;
    }
    else {
        Node temp = head;
        temp.setNext(next);
        while (temp.getNext() != null) {
            temp = temp.getNext();
        }
        Node t = temp.getNext();
        t = n;
    }
}
  

это означает, что, когда ваш temp следующий узел равен null, вы никогда не добавляете узел, который вы создаете, с вашим int аргументом.

Измените else блок следующим образом:

 else {
    Node temp = head;
    temp.setNext(next);
    while (temp.getNext() != null) {
        temp = temp.getNext();
    }
    temp.setNext(n);
    //two redundant lines removed
}
  

Соответственно, удалите head.setNext(next); (и, возможно, ненужный System.out.println() оператор) из вашего printList() метода.


P. S. Я бы очень рекомендовал вам потратить некоторое время на структуру данных связанного списка (структуру данных, а не код Java), поскольку ваш текущий дизайн показывает, что вам нужно лучше понять это.