не могу убрать чётные значения из односвязного списка, java
Сам узел представлен вот так:
public static class Node {
int val;
Node next;
Node() {
}
}
Я создаю Node head и заполняю числами от 0 до 9. Это точно работает.
Т.е. в head у меня есть 0->1->2->3->4->5->6->7->8->9
Теперь мне нужно убрать из списка чётные элементы. Для этого написан метод:
private static Node removeEven(Node head){
Node result = head; //в результат я кладу ссылку на head
Node temp; //делаю временный контейнер для перестановок
while (result != null) {
if (result.val %2 == 0) { //если значение чётное //0
temp = result.next; //тогда в temp я положу то, на что ссылается result //1->2->3...
result.next = null; //в result лежит 0 и мне нужно оборвать ссылку на 1 //0->null
result = temp; //в result я кладу 1 //1->2->3...
}
else {
result = result.next; //иначе я просто перешагиваю и кладу в result следующее значение
}
}
return head; //и возвращаю модифицированный список.
}
Вместо этого я получаю в конце head, в котором просто 0->null.
Пожалуйста, подскажите, где конкретно я ошибаюсь?
Ответы (2 шт):
Для решения следует сначала найти новое начало списка head с нечётным значением.
Затем на чётность проверяются значения в следующих узлах, которые пропускаются переприсваиванием ссылки.
Присваивания null в данном случае не требуется.
Вариант решения:
private static Node removeEven(Node head) {
// ищем новую голову списка, пропуская узлы с чётными значениями
while (head != null && (head.val & 1) == 0) {
head = head.next;
}
Node current = head;
// нашли главу списка с нечётным значением (или пустую)
while (current != null && current.next != null) {
// проверяем следующее значение на чётность
if ((current.next.val & 1) == 0) {
current.next = current.next.next; // пропускается следующий узел с чётным значением
}
current = current.next;
}
return head; //возвращается модифицированный список.
}
private static Node removeEven(Node head){
Node result = head; //сделал переменную, через которую я буду возиться с узлами
if (head.val %2 == 0){ //проверил будет ли в голове списка чётное, если да, то в head голова будет нечётной
head = head.next;
result = head;
}
Node tmp; //сделал переменную, в которой буду хранить ссылку на ноду, которую нужно будет придержать
while(result.next!=null){ //пока список не закончился
if(result.val % 2 == 0){
result = result.next; //если попалось чётное, не трогаю, просто кидаю следующее в result
}
else { //если нечётное, играемся
if (result.next.next != null) { //проверка, написанная на нервах
tmp = result.next.next; //в тмп попадает сле-следующая нода
result.next = tmp; //для текущей следующая станет сле-следующей
result = result.next; //в резалт кидается следующий элемент
}
}
}
return head; //тут уже будет модифицированный список
}
Короче, я попробовал ещё раз сам. Криво, но работает. Сердца любви всем, кто ответил в треде)