2011-12-15 2 views
0

Вот связанный код списокУдаление узла из дважды связанного списка?

public class LList 
{ 
protected int size; 
protected DNode tail, header; 

public LList() 
{ 
    size = 0; 
    tail = null; 
    header = tail; 
} 

public void addDNode(DNode v) 
{ 
    // means list is empty, so add first element 
    if (header == null) 
    {  
     header = v; 
     tail = header; // first element so (head == tail) 
    } 
    else 
    { 
     tail.setNext(v); 
     v.setPrev(tail); 
     v.setNext(null); 
     tail = v; 
    } 
    size++; 
} 

и способ удалить узел, проблема

public DNode removeDnode(DNode current) 
{ 
    if(current.nextNode() == null) 
    { 
     DNode previous = current.prevNode(); 
     previous.setNext(null); 
     current.setPrev(null); 
    } 
    else if (current.prevNode() == null) 
    { 
     DNode next = current.nextNode(); 
     next.setPrev(null); 
     current.setNext(null); 
    } 
    else 
    { 
     DNode next = current.nextNode(); 
     DNode previous = current.prevNode(); 
     previous.setNext(next); 
     next.setPrev(previous); 
     current.setPrev(null); 
     current.setNext(null); 
    } 
    size = size - 1; 
    return current; 
} 

Проблема заключается в том, что, когда я использую previous.setNext (NULL); он не позволит мне добавить узел снова, который, я думаю, имеет какое-то отношение к заголовку и хвосту.

однако когда я использую previous.setNext (tail); он, кажется, не удаляет его из списка?

+0

Похоже, домашнее задание. –

+0

Кажется, что ваши первые два блока 'if' в вашем методе' remove' предназначены для 'LinkedList', у которых нет заголовков/хвостов. Весь смысл иметь заголовки и хвосты, так что вы можете рассматривать каждый узел в списке один и тот же. – corsiKa

+0

Не допускайте двойных почтовых отправлений – PTBG

ответ

1

Проблема заключается в том, что если вы удалите tail, вы должны переместить ее. Так что попробуйте

DNode previous = current.prevNode(); 
    previous.setNext(null); 
    current.setPrev(null); 
    tail = previous; 

У вас есть такая же проблема с next бут я считаю, как только вы закончите с tail, вы исправить это легко.

2

Разве вы не забыли указать хвост списка на предыдущий элемент при удалении последнего?

if(current.nextNode() == null) { 
    DNode previous = current.prevNode(); 
    previous.setNext(null); 
    current.setPrev(null); 
    tail = previous; //isn't this missing?! 
} 
0

Обращение снят из двунаправленного перечня: ОЧЕНЬ сложно. Когда вы обнаружите ошибку при тестировании, не просто делайте «быстрое исправление» - вернитесь и четко поймите, почему это не сработало, и поймите, как ваше намеренное исправление изменит поведение , а не только то, что в настоящее время плохо.

Если вы думаете об этом внимательно, вы можете заставить его работать с минимальными проблемами. Если вы не будете думать осторожно, вы будете часами цепляться за хвост.

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