Я вижу несколько вещей:
Прежде всего, ваш последний возвратного заявление сделает метод возвращает первый раз, когда вы найдете элемент, равный x
. Вы должны удалить его. Это одна из причин ошибки.
Я думаю, вы хотели использовать цикл while здесь, чтобы найти каждый x
в начале start
?
else if (start.data.equals(x)) {
start = start.next;
count--;
}
Теперь посмотрим, что происходит, если start
состоит только из одного элемента, и этот один элемент также равен x
? Вы получите исключение здесь
for (ptr = start; ptr.next != null; ptr = ptr.next) {
, как бы вы назвали null.next
, что не существует. На самом деле это будет еще хуже с циклом while, но, к счастью, нулевой тест поможет.;)
Теперь более косметические вещи:
Это
if (start == null)
return;
else if (start.data.equals(x)) {
может быть написана как
if (start == null)
return;
if (start.data.equals(x)) {
, опуская else
становится немного легче читать, даже если он будут вести себя одинаково.
Это то, что я хотел бы написать:
public void eraseNumber(Object x) {
while (start != null && start.data.equals(x) {
start = start.next;
count--;
}
Node lastNode = start;
Node currentNode = start;
while (currentNode != null) {
if (currentNode.data.equals(x)) {
lastNode.next = currentNode.next;
count--;
} else {
lastNode = currentNode;
}
currentNode = currentNode.next;
}
}
Вы можете заменить Object
с чем-то более конкретное.
Примечание: мне пришлось исправить ошибку в моей реализации, пропуская первый х в связанном списке.
Это вопрос домашнего задания? – jimbojw
Действительно ли 'Объект' наиболее конкретный, который вы можете использовать в качестве ввода для своего метода? Я спрашиваю, как метод называется 'eraseNumber', который более специфичен, чем' Object'. – TheMorph
Спасибо, я исправил его – DaBulls33