2013-10-24 3 views
0

Я работаю над этим кодом для удаления элементов из списка связанных ссылок. Так скажите, что список {3,3,7,8,4,3,0,4} .. И я хочу удалить все 3's Мой выход должен быть 7, 8, 4, 0, 4Использование связанного списка для удаления элементов

Код, который я создал, удаляет только одну из трех, а не все.

public void eraseNumber(Object x) 
{ 
    if (start == null) 
    return; 
    else if (start.data.equals(x)) { 
    start = start.next; 
    count--; 
    } 
    else { 
    Node ptr; 
    for (ptr = start; ptr.next != null; ptr = ptr.next) { 
     if (ptr.next.data.equals(x)) { 
     ptr.next = ptr.next.next; 
     count--; 
     return; 
     } 
    } 
    } 

Выездное поставил я получаю за этот код 3, 7, 8, 4, 3, 0, 4.

+0

Это вопрос домашнего задания? – jimbojw

+1

Действительно ли 'Объект' наиболее конкретный, который вы можете использовать в качестве ввода для своего метода? Я спрашиваю, как метод называется 'eraseNumber', который более специфичен, чем' Object'. – TheMorph

+0

Спасибо, я исправил его – DaBulls33

ответ

0

Вы просто return ИНГ из метода, если число будет удалено находится на start, или совпадение находится в вашей петле for. Вам нужно будет удалить if-else, чтобы программа запускала цикл for и удаляла return;, чтобы вы могли перебирать все элементы списка.

Также обратите внимание на использование цикла while, чтобы удалить все соответствующие номера в start вашего списка.

while (start != null && start.data.equals(x)) { // use while here 
start = start.next; 
count--; 
} 

for (Node ptr = start; ptr != null && ptr.next != null;) { 
    if (ptr.next.data.equals(x)) { 
    ptr.next = ptr.next.next; 
    count--; 
    } else // conditional increment 
    ptr = ptr.next; 
} 
+0

Используя цикл while в нижней половине кода, кажется, вы обязательно поднимете исключение NullPointerException. – TheMorph

+0

@ TheMorph Спасибо за улов. Я покончил с «пока» вообще. Не понравился цикл * loop в цикле *, все еще устраняя последовательные совпадения, как и раньше. –

0

Поскольку это if-elseIf конструкции, код будет ввести первый elseif, а затем выйдет из метода без ввода окончательного else.

Используйте цикл while или for, чтобы перебирать связанный список.

0

Возврат в вашем операторе if заставляет ваш код выйти из оператора if и цикла for, если что-то найдено. Поэтому в первый раз, когда вы найдете 3, вы выходите из цикла for. удалить возврат, и он должен работать правильно. , Я не уверен,

0

Ravi Allready сказал вам путь, но я думаю, что у также следует заменить, если с в то время как

if (start == null) 
return; 
while (start.data.equals(x)) { // use while here 
start = start.next; 
count--; 
} 
Node ptr; 
for (ptr = start; ptr.next != null; ptr = ptr.next) { 
    while (ptr.next != null && ptr.next.data.equals(x)) { //while to remove a sequence of 3's 
    ptr.next = ptr.next.next; 
    count--; 
    // return; don't exit here 
    } 
} 
+0

Используя цикл while в нижней половине кода, кажется, что вы обязательно поднимете исключение NullPointerException. – TheMorph

+0

thats true, я добавил второе условие в цикл – YAMM

+0

Вы дублировали некоторые функции цикла for с циклом while. Вам это действительно не нужно. 'if' отлично работает. – TheMorph

0

Я вижу несколько вещей:

Прежде всего, ваш последний возвратного заявление сделает метод возвращает первый раз, когда вы найдете элемент, равный 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 с чем-то более конкретное.

Примечание: мне пришлось исправить ошибку в моей реализации, пропуская первый х в связанном списке.

Смежные вопросы