有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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] 如何解决这个问题


共 (2) 个答案

  1. # 1 楼答案

    让我们创建用于连接其他节点的服务节点

    然后在列表中循环并复制新列表中的引用(不创建新节点):

    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;
        }
    }
    
  2. # 2 楼答案

    问题不在于尾部节点。问题在于,一行中有两个偶数节点,而不管它们在列表中的什么位置。当当前节点为偶数时,您正在将指向上一个节点(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;
        }
    }
    

    还有一个编程技巧:在尝试诊断问题之前,先做几个测试用例。我发现,基于少量测试用例,很容易得出错误的结论,通常扩大范围会让问题变得更清楚。这是测试驱动开发工作得如此之好的(许多)原因之一