从在尾节点不起作用的链表中删除偶数?

Removing even numbers from a linked list not working at the tail node?

void deleteEven() {
        boolean con = false;
        Node add;
        Node move;
        move = head;
        if (move.data % 2 == 0) {
            head = move.next;
            con = true;
        }
        add = move;
        move = move.next;
        while (move != null) {
            if (move.data % 2 == 0 ) {
                add.next = move.next;
                con = true;
            }
            add = move;
            move = move.next;
        }
        if (!con)
            System.out.println("No even numbers in list");
    }

它适用于除尾部以外的每个节点。 如果链表是 [5,4,3,2,2] 结果是 [5,3,2] 如何解决?

让我们创建服务节点以附加其他节点。

然后遍历列表并将引用复制到新列表中(不创建新节点):

void deleteEven() {
    Node tmpHead = new Node(0, null);
    Node tmpCopy = tmpHead;
    Node tmp = head;
    while (tmp != null) {
        if (tmp.data % 2 == 1) {
            tmpCopy.next = tmp;
            tmpCopy = tmpCopy.next;
        }
        tmp = tmp.next;
    }
    tmpCopy.next = null;
    head = tmpHead.next;
}

假设节点是什么:

class Node {
    int data;
    Node next;

    public Node(int data, Node next) {
        this.data = data;
        this.next = next;
    }
}

问题不在于尾节点。问题在于连续两个偶数节点,无论它们在列表中的位置如何。当当前节点为 even 时,即使您刚刚删除了它,您也将指向前一个节点 (add) 的指针移动到当前节点。对于第二个偶数节点,您的 add.next = move.next 语句针对您刚刚删除的节点更改 next

最简单的解决方案是只移动 add 如果节点不是偶数:

if (move.data % 2 == 1) {
    add.next = move.next;
    con = true;
} else {
    add = move.next;
}

您可以通过完全删除 add 并只查找 move 前面的一个节点来大大简化您的代码:

while (move.next != null) {
    if (move.next.data % 2 == 0) {
        move.next = move.next.next;
        con = true;
    } else {
        move = move.next;
    }
}

还有一个编程技巧供您参考:在尝试诊断问题之前进行多个测试用例。我发现基于少量测试用例很容易得出错误的结论,通常扩大范围会使问题更清楚。这是测试驱动开发如此有效的(许多)原​​因之一。