2013-05-12 3 views
1

Ребята, поэтому я перехожу к нескольким моим методам в моем классе Linked List, и я получаю логическую ошибку при удалении узла из связанного списка. Я работал над методом removeFirst(), когда я также обнаружил ошибку в методе removeLast(). Проблема в том, что оба удаляют последний элемент в списке. не знаю почему, но вот мой код.Как удалить первый узел в связанном списке?

Удалить первый узел

public T removeFirst() throws EmptyCollectionException 
{ 
// Checking to see if the List is empty or not 
    if (isEmpty()) 
     throw new EmptyCollectionException("LinkedList"); 

    Node <T> temp = contents; 

    T next = contents.getNext().getItem(); 

    contents = new Node (next, contents); 
    count--; 

    return temp.getItem(); 
} 



Удалить последний узел

public T removeLast() // fixed 
{ 
// Checking to see if the List is empty or not 
    if (isEmpty()) 
     throw new EmptyCollectionException("LinkedList"); 

    // Node<T> temp = contents; 
    Node<T> current = contents; 
    Node<T> prev = null;   

    while (current.getNext() != null) 
    { 
     prev = current; 
     current = current.getNext(); 
    } 

    prev.setNext(null); 

    count--; 

    return current.getItem(); 

} 

Я огляделся вопросы уже отвечал, но я не могу найти ответ Я ищу.
Я знаю, что узел имеет по меньшей мере два значения
один для хранения данных, а другой держать ссылку на следующий узел

Вот что я думаю, что это происходит в первой. Но когда я вызываю методы один за другим, они оба освобождаются от последнего узла. Idk Я просмотрю свой код и при необходимости обновлю этот вопрос. Но можете ли вы, ребята, увидеть, где я ошибаюсь, и указать мне в правильном направлении. Спасибо.

ответ

2

Если у вас есть список A-> B-> C, A - это голова («содержимое») вашего списка, чтобы удалить его, вам просто нужно направить указатель на B, то есть следующий узел в списке:

public T removeFirst() throws EmptyCollectionException { 
    // Checking to see if the List is empty or not 
    if (isEmpty()) 
     throw new EmptyCollectionException("LinkedList"); 

    Node<T> first = contents; 

    contents = contents.getNext(); 
    count--; 

    return first.getItem(); 
} 

Поскольку вы также должны возвращать данные, связанные с первым узлом, вам нужно сохранить временную ссылку на него. (Я назвал его first)

+0

Спасибо, что отлично сработал для removeFirst(). По какой-то причине я думал, что мне нужен новый узел, поэтому сначала нужно получить элемент во втором узле, а затем связать его с остальной частью списка. Ваш метод намного проще. И я думаю, что я понял, почему я снова возвращаю первый узел в removeLast(). xD – Raw415

0

Я думаю, вам нужно добавить головной узел в свой любимый класс списка для определения frst узла списка.

public void deleteFront() 
{ 
if (head!=null) 
head = head.Next; 
} 
+0

Спасибо. это тоже работает. – Raw415

2
public void removeFirst() { 
     if (head == null) 
       return; 
     else { 
       if (head == tail) { 
        head = null; 
        tail = null; 
       } else { 
        head = head.next; 
       } 
     } 
    } 
0
public T removeFirst() throws EmptyCollectionException { 
if (isEmpty()) 
    throw new EmptyCollectionException("LinkedList"); 

Node <T> temp = contents; 

T next = contents.getNext().getItem(); 

contents = new Node (next, contents); 
count--; 



    return temp.getItem(); 
} 

В этом методе комментарий Последние три заявления. затем добавьте ниже трех строк

contents=contents.getNext() 
count--; 
return next; 

Для удаления последнего узла: его внешний вид мне очень подходит.

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