我是Java的新手。
我创建了一个方法,该方法将删除LinkedList中除第一个元素以外的元素。这个想法是,如果LinkedList的元素数据(在Integer中)与参数匹配,则将布尔值设置为true。布尔值设置为true后,它将删除所有也与初始元素匹配的元素。
现在解决问题。例如,如果我要从此LinkedList中删除除第一个以外的5个:
5 5 5 6 5 7 8 9
我将得到如下结果:
5 5 6 7 8 9
如您所见,它没有删除第二个位置上的5。我的代码有什么问题吗?
这是代码
public void append(int data) {
Node newNode = new Node(data);
if (head == null) {
head = new Node(data);
return;
}
Node lastNode = head;
while (lastNode.next != null) {
lastNode = lastNode.next;
}
lastNode.next = newNode;
return;
}
public void insert(int data) {
Node newData = new Node(data);
newData.next = head;
head = newData;
}
public void removeExceptFirst(int dataValue) { //The mentioned method
boolean duplicate = false;
Node currentNode = head;
while (currentNode.next != null) {
int value = currentNode.next.data;
if (value == dataValue) {
if (!duplicate) {
duplicate = true;
currentNode = currentNode.next;
} else {
currentNode.next = currentNode.next.next;
}
} else {
currentNode = currentNode.next;
}
}
return;
}
答案 0 :(得分:1)
问题出在这里
if (!duplicate) {
duplicate = true;
currentNode = currentNode.next;
}
您将重复标记为true,并立即分配“ currentNode = currentNode.next;”。 由于此引用正在保留下一个节点 所以
1. Put the condition outside of the loop to check whether the head element itself is
that node, if->yes mark isDuplicate = true and proceed in the loop.
2. Inside the loop check afterward and then assign the next node.
希望这应该有效
答案 1 :(得分:0)
您跳过了头节点。尝试替换
Node currentNode = head;
与
Node currentNode = new Node();
currentNode.next = head;
答案 2 :(得分:0)
您应该更新当前节点引用,并且head->下一步应在删除节点后指向当前节点。 试试下面的代码:
if (!duplicate) {
duplicate = true;
currentNode = currentNode.next;
head.next= currentNode.next;
}else {
currentNode.next = currentNode.next.next;
currentNode = currentNode.next;
head.next = currentNode; }
`