не могу убрать чётные значения из односвязного списка, 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 шт):

Автор решения: Nowhere Man

Для решения следует сначала найти новое начало списка 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;  //возвращается модифицированный список.
}
→ Ссылка
Автор решения: Eddie
 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; //тут уже будет модифицированный список
    }

Короче, я попробовал ещё раз сам. Криво, но работает. Сердца любви всем, кто ответил в треде)

→ Ссылка