#java #data-structures #linked-list #nodes
Вопрос:
Я работаю над проектом для своего класса структур данных, в котором меня просят написать класс для реализации связанного списка int.
- Используйте внутренний класс для узла.
- Включите следующие методы.
- Напишите тестер, который позволит вам протестировать все методы с любыми данными, которые вы хотите, в любом порядке.
Я должен создать метод под названием «public int deleteFromFront ()». Этот метод предназначен для «Удаления узла в начале списка и возврата int, который был в нем, или null, если список пуст». У меня есть свой код для этого метода ниже. Однако, когда я тестирую этот метод, я получаю неверный вывод. Он должен возвращать значение узла, который был удален, или значение null, если список пуст. Так, например, если бы у меня был такой список «4 3 10 11 3 15 6 11 18 17» и я хотел удалить первый узел, метод должен возвращать 4, так как 4-это первый узел. В то время как метод удаляет 4, он возвращает 3 значение нового заголовка. Кто-нибудь знает, что я сделал не так? и как это исправить?
import java.util.Random;
import java.util.Scanner;
public class LinkedListOfInts {
Node head;
Node tail;
private class Node {
int value;
Node nextNode;
public Node(int value, Node nextNode) {
this.value = value;
this.nextNode = nextNode;
}
}
public LinkedListOfInts(LinkedListOfInts 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 LinkedListOfInts(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 LinkedListOfInts(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);
}
public int deleteFromFront() {
if (head == null)
return -1;
else {
if (head == tail) {
head = null;
tail = null;
} else {
head = head.nextNode;
}
}
return head.value;
}
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);
LinkedListOfInts list = new LinkedListOfInts(10, 1, 20);
LinkedListOfInts copy = new LinkedListOfInts(list);
boolean done = false;
while (!done) {
System.out.println("1. Delete from Front");
System.out.println("2. toString");
switch (input.nextInt()) {
case 1:
System.out.println("Delete an Item at the Front of the List");
System.out.println(list.deleteFromFront());
break;
case 2:
System.out.println("toString");
System.out.println(list.toString());
break;
}
}
}
}
Комментарии:
1. Пожалуйста, прочитайте: Как отлаживать небольшие программы . Подсказка: посмотрите, на какой узел ссылается
head
непосредственно перед выполнением последнегоreturn ...;
deleteFromFront()
входа.2. В методе есть вторая ошибка
deleteFromFront()
, она связана сhead == tail
делом. — Спецификация методаdeleteFromFront()
неоднозначна. Как написано в описании, методdeleteFromFront()
не может возвращатьint
значения (в противном случае он не сможет вернутьсяnull
, если список пуст).3. @Turing85 прямо перед оператором возврата я установил head = head.nextNode; Как только я удалю первый узел в списке, head должен перейти к следующему значению в списке. Как только этот метод будет выполнен, он должен вернуть значение удаленного узла. Проблема в том, что я не вижу способа сделать это.
Ответ №1:
Вы должны сохранить старое head
значение узла в переменной, а затем удалить head node
его . Также позже вы должны вернуть эту переменную.
public int deleteFromFront() {
int headValue = -1;
if (head == null)
return headValue;
else {
if (head == tail) {
head = null;
tail = null;
} else {
headValue = head.value;
head = head.nextNode;
}
}
return headValue;
}