#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 "}";
}