#java #linked-list #singly-linked-list
#java #связанный список #односвязный список
Вопрос:
Я новичок в Java.
Я создал метод, в котором он будет удалять элементы из LinkedList, кроме первого. Идея заключается в том, что логическое значение будет установлено в true, если данные элемента LinkedList (которые являются целыми числами) совпадают с параметром. Как только логическое значение принимает значение true, оно удалит любой элемент, который также соответствует исходному.
Теперь о проблеме. Например, если бы я удалил 5 элементов из этого LinkedList, кроме первого:
5 5 5 6 5 7 8 9
Я получу результат, подобный этому:
5 5 6 7 8 9
Как вы можете видеть, это не привело к удалению 5 на второй позиции. Что-то не так с моим кодом?
Кстати, вот код
public void append(int data) {
Node newNode = new Node(data);
if (head == null) {
head = new Node(data);
return;
}
Node lastNode = head;
while (lastNode.next != null) {
lastNode = lastNode.next;
}
lastNode.next = newNode;
return;
}
public void insert(int data) {
Node newData = new Node(data);
newData.next = head;
head = newData;
}
public void removeExceptFirst(int dataValue) { //The mentioned method
boolean duplicate = false;
Node currentNode = head;
while (currentNode.next != null) {
int value = currentNode.next.data;
if (value == dataValue) {
if (!duplicate) {
duplicate = true;
currentNode = currentNode.next;
} else {
currentNode.next = currentNode.next.next;
}
} else {
currentNode = currentNode.next;
}
}
return;
}
Комментарии:
1. Если вы пытаетесь предотвратить дублирование, есть ли какая-то причина, по которой вы не можете использовать LinkedHashSet ?
2. @D.B. Это могло бы сработать, но я пытаюсь удалить дубликаты, не используя это
Ответ №1:
Проблема здесь в
if (!duplicate) {
duplicate = true;
currentNode = currentNode.next;
}
вы отмечаете duplicate = true и немедленно присваиваете «currentNode = currentNode.next;»
из-за этой ссылки сохраняется следующий узел
Итак
1. Put the condition outside of the loop to check whether the head element itself is
that node, if->yes mark isDuplicate = true and proceed in the loop.
2. Inside the loop check afterward and then assign the next node.
Надеюсь, это должно сработать
Комментарии:
1. Это сработало, но возникла другая проблема. Я пробую новый метод в обратном LinkedList, который: 9 8 7 5 6 5 5 5. В то время как исходный LinkedList работает нормально, в обратном из него были удалены все 5, в результате чего получилось: 9 8 7 6. Я попробовал решение lauthu, и оно сработало
Ответ №2:
Вы пропустили головной узел. Попробуйте заменить
Node currentNode = head;
с помощью
Node currentNode = new Node();
currentNode.next = head;
Комментарии:
1. Спасибо! Этот работает нормально. Я также создаю новый LinkedList, который является обратной версией исходного и все еще работает.
Ответ №3:
Вы должны обновить текущую ссылку на узел, а также head-> next должны указывать на текущий узел после удаления узла. попробуйте приведенный ниже код:
if (!duplicate) {
duplicate = true;
currentNode = currentNode.next;
head.next= currentNode.next;
}else {
currentNode.next = currentNode.next.next;
currentNode = currentNode.next;
head.next = currentNode; }
`