Присоединение к связанному списку в Java - PullRequest
0 голосов
/ 30 сентября 2018

Код компилируется и запускается, но метод addToEnd не работает, мне кажется, что это правильно, но я не уверен, где ошибка, может кто-нибудь подсказать мне, что или где нужно исправить код

Вот код для моего другого класса

 public class LinkedList {
 private Node head;


 /**
  * constructor
  * pre: none
  * post: A linked list with a null item has been created.
  */
 public LinkedList() {
  head = null;
 }

 /** 
  * Activity: finds size of the Linked List.
  * Pre-Condition: none
   * Post-Condition: The size of the list is returned
  */
 public int size() {
   int counter  = 0;
   Node current = head;

   while(current != null) {
    counter++;
    current = current.getNext();
  }
   return counter;   
}

  /** 
  * Adds a node to the end of the linked list.
  * pre: String parameter
  * post: The linked list has a new node at the end.
  */
 public void addAtEnd(String s) {
  Node current = head;
  Node newNode = new Node(s);
   if(head == null) {
     head = newNode;
     head.setNext(null);
   } 
   else {
     while(current.getNext() == null) {
       current.setNext(newNode);
       current = newNode;
   } 
 }
 }

 private class Node {
 private String data;
 private Node next;


  /**
   * constructor
   * pre: none
   * post: A node has been created.
   */
  public Node(String newData) {
   data = newData;
   next = null;
  }


  /**
   * The node pointed to by next is returned
   * pre: none
   * post: A node has been returned.
   */
  public Node getNext() {
   return(next);
  }


  /**
   * The node pointed to by next is changed to newNode
   * pre: none
   * post: next points to newNode.
   */
  public void setNext(Node newNode) {
   next = newNode;
  }


  /**
   * The node pointed to by next is returned
   * pre: none
   * post: A node has been returned.
   */
  public String getData() {
  return(data);
  }
 }
}

Вот мой код для основного класса, Блюм и Даль никогда не добавляются в список:

 public class LinkedListDemo {

 public static void main(String[] args) {
 LinkedList list = new LinkedList();

  list.addAtFront("Sachar");
  list.addAtFront("Osborne");
  list.addAtFront("Suess");
  System.out.println("List has " + list.size() + " items.");
  System.out.println(list);

  list.addAtEnd("Blume");
  list.addAtEnd("Dahl");
  System.out.println(list);
}
    }

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018
 public void addAtEnd(String s) {
  Node current = head;
  Node newNode = new Node(s);
   if(head == null) {
     head = newNode;
     head.setNext(null);
   } 
   else {// problem is here. You need to find the  node that has getNext()==null, 
         //so you need to loop all nodes where get next != null
     while(current.getNext() == null) { 
       current.setNext(newNode);
       current = newNode;
   } 
 }

Изменить на

else{ 
    //iterate to the last node
    while(current.getNext() != null) { 
    current = current.getNext(); 
    } 
    //Append the new node to the end
    current.setNext(newNode);  
}
0 голосов
/ 30 сентября 2018
public void addAtEnd(String s) {
    Node current = head;
    Node newNode = new Node(s);
    if(current == null) {
        head = newNode;
    } else {
        while(current.getNext() != null) {
            current = current.getNext();
        }
        current.setNext(newNode); 
    }
}
0 голосов
/ 30 сентября 2018
while (current.getNext() == null) {
    current.setNext(newNode);
    current = newNode;
}

Это просто неверно;поскольку вы не отслеживаете конец списка, вам нужно перебрать весь список, а затем добавить newNode в конец (что, я полагаю, вы уже поняли).Для этого просто продолжайте устанавливать current в current.getNext(), пока current.getNext() не станет null, а затем вызовите current.setNext(newNode);

Node next;

while ((next = current.getNext()) != null) {
    current = next;
}

current.setNext(newNode);
...