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] 如何解决这个问题
# 1 楼答案
让我们创建用于连接其他节点的服务节点
然后在列表中循环并复制新列表中的引用(不创建新节点):
假设节点是什么:
# 2 楼答案
问题不在于尾部节点。问题在于,一行中有两个偶数节点,而不管它们在列表中的什么位置。当当前节点为偶数时,您正在将指向上一个节点(
add
)的指针移动到当前节点,即使您刚刚删除了它。对于第二个偶数节点,add.next = move.next
语句更改了next
刚刚删除的节点最简单的解决方案是仅在节点不均匀时移动
add
:通过完全去掉
add
,只需查看move
前面的一个节点,就可以大大简化代码:还有一个编程技巧:在尝试诊断问题之前,先做几个测试用例。我发现,基于少量测试用例,很容易得出错误的结论,通常扩大范围会让问题变得更清楚。这是测试驱动开发工作得如此之好的(许多)原因之一