С LinkedList вы имеете дело с ссылкой реализация объектов, которые связаны вместе с узлами. Узел содержит объект и ссылку на следующий узел. Вы должны стараться не перебирать LinkedList с помощью индексов, потому что когда вы начинаете удалять или добавляете узлы, индексы меняются. В отличие от массива, который будет содержать пробел, если вы удалите его содержимое, как только вы удалите узел из LinkedList, список уменьшится в размере, поскольку предыдущий узел теперь ссылается на узел, который пришел после того, который вы удалили, и удаленный узел теряется в памяти. Итак, в вашем примере вам нужно учитывать, что индекс изменится после удаления дубликата. По этой причине вы всегда должны пытаться пересечь LinkedList на Java через с ссылкой и не индексировать. В вашем случае это может сработать:
void deleteReps(LinkedList<T> list)
{
Node prev = head; // A node to traverse with starts at the head
Node temp = head.getNext(); // A second node to traverse with
Node current = prev; // The node in question
while(prev.getNext() != null) // While the node after prev isn't the end
{ // of the list
T item = current.data; // The item we are looking for duplicates of
while(temp != null) // While temp isn't at the end of the list
{
if(temp.data == item) // If the item in temp is the same as the
{ // item we are looking for
prev.setNext(temp.getNext()); // Set the next Node of prev to the node
// after temp. This "deletes" the Node
// at temp
prev = temp; // prev is now temp
temp = temp.getNext(); // temp is the next Node
}
else // Else if the item is different
{
prev = temp; // prev is now temp
temp = temp.getNext(); // temp is now the next Node
}
} // end while
current = current.getNext(); // current is now the next Node
// so that the
// the next item we are looking for
// duplicates of is an item still in
// the LinkedList
prev = current;
temp = prev.getNext();
} // end while
}
Я дал подробные комментарии, чтобы вы могли следовать логике этого алгоритма. Это учитывает сокращение LinkedList при удалении узлов, поскольку current.getNext()
всегда будет узлом, который все еще находится в LinkedList после удаления дубликатов.
Это действительно работает, но, как вы упомянули, создание второго LinkedList ужасно неэффективно и пустая трата пространства памяти, особенно когда вы начинаете работать с удвоенными LinkedLists. – Jodo1992
Если вам нужно где-то спрятать свои уникальные значения, по крайней мере используйте 'Set'. –