从在尾节点不起作用的链表中删除偶数?
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;
}
}
还有一个编程技巧供您参考:在尝试诊断问题之前进行多个测试用例。我发现基于少量测试用例很容易得出错误的结论,通常扩大范围会使问题更清楚。这是测试驱动开发如此有效的(许多)原因之一。
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;
}
}
还有一个编程技巧供您参考:在尝试诊断问题之前进行多个测试用例。我发现基于少量测试用例很容易得出错误的结论,通常扩大范围会使问题更清楚。这是测试驱动开发如此有效的(许多)原因之一。