Методы добавления связанного списка и toString

#java #methods #linked-list

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

Вопрос:

Я пытаюсь вывести список, я добавил в список 3 строки, и все они выводят null. Кажется, что код добавляется и выводится правильно, однако он просто не выводит данные. Методы, на которых я фокусируюсь, — это prepend и toString.

` StringList открытого класса {

 /* ------------------------------------------------------- *
 * Inner classes                                           *
 * ------------------------------------------------------- */
/**
 * The node used by StringList.
 */
private class StrNode {

    String data;
    StrNode next;
}

/* ------------------------------------------------------- *
 * Instance variables                                      *
 * ------------------------------------------------------- */
private StrNode head;   // the head of the singly-linked list.

/* ------------------------------------------------------- *
 * Instance methods                                        *
 * ------------------------------------------------------- */
/**
 * No-argument constructor.
 */
public StringList() {
    head = null;
}

/**
 * Adds an item to the start of the list.
 *
 * @param s the item to add
 */
public void prepend(String s) {
    var newNode = new StrNode();
    // TODO: Adds an item to the start of the list.     
    if(head == null) {
        head = newNode;
    }
    else {
    newNode.next = head.next;
    head.next = newNode;
    }
    
}

/**
 * Adds an item to the end of the list.
 *
 * @param s the item to add
 */
public void append(String s) {
    // TODO:    Adds an item to the end of the list.
    
}

/**
 * Inserts an item after the first instance of a key if the key exists.
 *
 * @param s the item to insert
 * @param key the item in the list to insert after
 * @return whether the insertion was successful
 */
public boolean insertAfter(String s, String key) {
    // TODO:    Inserts an item after the first instance of a key if the key exists.
    
    return false;
}

/**
 * Deletes the first instance of an item from the list.
 *
 * @param key the value of the item to delete from the list.
 * @return whether the deletion was successful.
 */
public boolean delete(String key) {
    // TODO:    Deletes the first instance of an item from the list.
    
    return false;
}

/**
 * Returns the value of the nth item in the list.
 * 
 * @param n the zero-based index of the item to return
 * @return the value of the nth item
 */
public String get(int n) {
    // TODO:    Returns the value of the nth item in the list.
    // Note: if n is out of bounds, raise an IndexOutOfBoundsException.
    
    
    return null;
}

/**
 * Returns the number of items in the list.
 *
 * @return the number of items in the list
 */
public int length() {
    // TODO:    Returns the number of items in the list.
    int length = 0;
    StrNode current = head;
    
    while(current != null) {
        length  ;
        current = current.next;
    }
    
    return length;
}

/**
 * Returns a string of all the items in the list separated by a space.
 *
 * The last item will have a space after it too.
 *
 * @return list of the list's values
 */
@Override
public String toString() {
    // TODO:    Returns a string of all the items in the list separated by a space.
    String result = "{";
    StrNode current = this.head;
    
    while(current != null) {
        result  = current.data   " ";
        current = current.next;
    }
 
    return result   "}";

}
  

}
«

Драйвер: `

открытый класс Main { /** * @param аргументирует аргументы командной строки */ public static void main(строка[] аргументов) {

     StringList s = new StringList();
    
    s.prepend("one");
    s.prepend("two");
    s.prepend("three");
    System.out.println(s);      
    
}
  

}

«

Ответ №1:

Ошибка в вашем prepend(String s) методе. Внимательно посмотрите — вы никогда не используете s , т. Е. Строка, которую вы передаете этому методу, никогда не сохраняется. Вам просто нужно добавить newNode.data = s; в качестве второй строки. Однако существует и вторая ошибка, поскольку StrNode объекты связаны неправильно.

Решение

 public void prepend(String s) {
    var newNode = new StrNode();
    newNode.data = s;
    if (head == null) {
        head = newNode;
    } else {
        // First, we set the current head as the successor of the new newNode
        newNode.next = head;
        // Then, we set the new newNode as head (as we prepend)
        head = newNode;
    }
}
  

Затем вывод выглядит следующим образом:

 {three two one }
  

Дополнительный комментарий

Ваш toString() метод объединяет строки в цикле с . Это неэффективно и должно быть заменено на StringBuilder . StringBuilder также позволяет легко удалять последний пробел после «one»:

 @Override
public String toString() {
    StringBuilder result = new StringBuilder("{");
    StrNode current = this.head;

    while (current != null) {
        result.append(current.data).append(" ");
        current = current.next;
    }
    result.setLength(result.length() - 1);

    return result   "}";
}