Я пытаюсь удалить второе появление определенного объекта в одиночном списке.Удалите второе появление определенного объекта в одиночном списке
У меня этот код для моего узла:
public class Node {
Node next;
Object data;
public Node(Object _data)
{
next = null;
data = _data;
}
public Node(Object _data, Node _next)
{
next = _next;
data = _data;
}
public Object getData()
{
return data;
}
public void setData(Object _data)
{
data = _data;
}
public Node getNext()
{
return next;
}
public void setNext(Node _next)
{
next = _next;
}
}
И это моя функция для удаления:
public void removeSecondAppear(Object data)
{
Node temp = new Node(data);
Node current = head;
boolean found = false;
for(int i = 1; i < size(); i++)
{
current = current.getNext();
if(current.getData().equals(temp.getData()))
{
if(found == true)
{
// remove element
current.setNext(current.getNext().getNext());
listCount--;
break;
}
else if(found == false)
{
found = true;
}
}
}
}
По какой-то причине он не удалит элемент. Метод найти его отлично работает, но я не знаю, почему он не удалит элемент. У меня есть аналогичные функции, чтобы удалить элемент определенного индекса, который работает отлично:
public boolean remove(int index)
{
if(index < 1 || index > size())
{
return false;
}
Node current = head;
for(int i = 1; i < index; i++)
{
if(current.getNext() == null)
{
return false;
}
current = current.getNext();
}
current.setNext(current.getNext().getNext());
listCount--;
return true;
}
Я использую тот же methood, но он не будет работать в моем методе, чтобы удалить второй вид. Любая помощь, что я делаю wron ??
public int indexOf(Object data)
{
Node temp = new Node(data);
Node current = head.getNext();
for(int i = 0; i < size(); i++)
{
if(current.getData().equals(temp.getData()))
{
return i;
}
current = current.getNext();
}
return -1;
}
Моя реализация:
LinkedList LL = new LinkedList();
LL.add(1);
LL.add(2);
LL.add(3);
LL.add(4);
LL.add(4);
LL.add(5);
LL.removeSecondAppear("4");
Мой метод дополню:
public void add(Object data)
{
Node temp = new Node(data);
Node current = head;
while(current.getNext() != null)
{
current = current.getNext();
}
current.setNext(temp);
listCount++;
}
Мой конструктор:
public LinkedList()
{
head = new Node(null);
listCount = 0;
}
Почему бы не найти индекс, а затем вызвать ваш метод рабочего удалить? –
@ ElliottFrisch Это хороший вариант, я тоже могу использовать этот метод, но поскольку я уже начал с этого, мне интересно, где моя ошибка. – user12831231
Небольшое примечание: переместите этот 'current = current.getNext();' в конец вашего цикла. Он пропускает головной узел, даже не проверяя ничего. Вы пробовали отладку? –