#java #data-structures #methods #linked-list #nodes
Вопрос:
Я работаю над проектом для своего класса структур данных, в котором меня просят написать класс для реализации связанного списка int.
- Используйте внутренний класс для узла.
- Включите следующие методы.
- Напишите тестер, который позволит вам протестировать все методы с любыми данными, которые вы хотите, в любом порядке.
Я должен создать метод под названием «частный узел getPreviousNode». Этот метод предназначен для «возврата значения узла, которое находится непосредственно перед элементом, или значения null, если его нет». У меня есть свой код для этого метода ниже. Однако, когда я тестирую этот метод, я получаю неверный вывод. Он должен возвращать значение узла, которое находится непосредственно перед элементом, или значение null, если его нет. Так, например, если бы у меня был такой список «9 10 2 5 16 18 17 1 2 19» и я хотел получить предыдущий узел 16, метод должен возвращать 5. Но вместо этого он возвращает «LinkedListOfInts$Node@5b464ce8» Кто-нибудь знает, что я сделал не так? и как это исправить?
import java.util.Random;
import java.util.Scanner;
public class LinkedListOfIntsTest {
Node head;
private class Node {
int value;
Node nextNode;
public Node(int value, Node nextNode) {
this.value = value;
this.nextNode = nextNode;
}
}
public LinkedListOfIntsTest(LinkedListOfIntsTest other) {
Node tail = null;
for (Node n = other.head; n != null; n = n.nextNode) {
if (tail == null)
this.head = tail = new Node(n.value, null);
else {
tail.nextNode = new Node(n.value, null);
tail = tail.nextNode;
}
}
}
public LinkedListOfIntsTest(int[] other) {
Node[] nodes = new Node[other.length];
for (int index = 0; index < other.length; index ) {
nodes[index] = new Node(other[index], null);
if (index > 0) {
nodes[index - 1].nextNode = nodes[index];
}
}
head = nodes[0];
}
public LinkedListOfIntsTest(int N, int low, int high) {
Random random = new Random();
for (int i = 0; i < N; i )
this.addToFront(random.nextInt(high - low) low);
}
public void addToFront(int x) {
head = new Node(x, head);
}
private Node getPreviousNode(int item) {
Node previous = null;
for (Node ptr = head; ptr != null; ptr = ptr.nextNode) {
if (ptr.value == item)
return previous;
previous = ptr;
}
return null;
}
public String toString() {
String result = " ";
for (Node ptr = head; ptr != null; ptr = ptr.nextNode)
result = ptr.value " ";
return resu<
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
LinkedListOfIntsTest list = new LinkedListOfIntsTest(10, 1, 20);
LinkedListOfIntsTest copy = new LinkedListOfIntsTest(list);
boolean done = false;
while (!done) {
System.out.println("1. Get Previous Node");
System.out.println("2. toString");
switch (input.nextInt()) {
case 1:
System.out.println("Get Previous Node");
System.out.println(list.getPreviousNode(input.nextInt()));
break;
case 2:
System.out.println("toString");
System.out.println(list.toString());
break;
}
}
}
}
Комментарии:
1. Какого результата вы ожидаете? Если это
value
один изNode
них , вам нужно будет реализоватьtoString
его в своемNode
классе.2. @tgdavies Он должен возвращать значение узла, которое находится непосредственно перед элементом, или значение null, если его нет. Так, например, если бы у меня был такой список «9 10 2 5 16 18 17 1 2 19» и я хотел получить предыдущий узел 16, метод должен возвращать 5. Но вместо этого он возвращает «LinkedListOfInts$Node@5b464ce8».
3. @ErwinBolwidt этот код был из того, над чем я работал в классе. Но профессор хотел, чтобы мы изменили код, чтобы он возвращал значение узла, которое находится непосредственно перед элементом, или значение null, если его нет. Однако мое понимание Связанного списка не так уж велико, так как я начал узнавать о них только неделю назад, и у меня есть проект по этому вопросу, который должен состояться в понедельник.
Ответ №1:
Этот метод предназначен для «возврата значения узла, которое находится непосредственно перед элементом, или значения null, если его нет». У меня есть код для этого метода ниже
Поскольку метод должен возвращать значение узла, он должен возвращать не сам экземпляр узла, а его value
элемент.
Поскольку ваши значения узлов int
равны s, выбор этого типа в качестве возвращаемого типа функции будет казаться уместным, но поскольку вы также должны предусмотреть null
возвращаемое значение, тип возвращаемого значения должен быть Integer
.
Наконец, есть еще одна проблема с функцией: при вызове search
со значением, которое вообще не встречается в списке, она возвращает конечный узел списка. Также в этом случае он должен вернуться null
.
Вот возможная коррекция:
private Integer getPreviousNode(int item) {
if (head != null)
for (Node previous = head; previous.nextNode != null; previous = previous.nextNode)
if (previous.nextNode.value == item)
return previous.value;
return null;
}