Java 删除循环链表中给定键的所有匹配项
我正在尝试删除循环链接列表中给定键的所有匹配项,例如: 1->0->1->0 key number=1删除所有出现的数字1,并以以下内容结束: 0->0 但我从代码中得到的是: 0->1->0->1 它将头移到列表的末尾,而不是将其删除 我发现的另一个问题是,如果有两个或多个数字的值相同,则总是会留下一个,例如: 0->1->1->0 我得到了这个结果 0->1->0 代码Java 删除循环链表中给定键的所有匹配项,java,data-structures,linked-list,Java,Data Structures,Linked List,我正在尝试删除循环链接列表中给定键的所有匹配项,例如: 1->0->1->0 key number=1删除所有出现的数字1,并以以下内容结束: 0->0 但我从代码中得到的是: 0->1->0->1 它将头移到列表的末尾,而不是将其删除 我发现的另一个问题是,如果有两个或多个数字的值相同,则总是会留下一个,例如: 0->1->1->0 我得到了这个结果 0->1->0 代码 public void remove(int num) { if (isEmpty()) {
public void remove(int num) {
if (isEmpty()) {
System.out.println("Empty List");
} else {
Node currentLink = head;
Node previousLink = head;
boolean run = true;
while (run) {
if (currentLink.data == num) {
currentLink.size--;
if (currentLink == head) { //Delete head
head = head.next; // Deletes head but then it appears on the end of the list
} else
previousLink.next = currentLink.next; // Deletes all occurrences of a given key but always leaves one if they are next to each other
}
previousLink = currentLink;
currentLink = currentLink.next;
if (currentLink == head) run = false;
}
}
}
您的问题是,在从列表中删除节点时,您没有处理这种情况。例如,当您删除非
头的currentLink
时,您没有将currentLink
分配给下一个节点(在移动到下一个节点之前)。
你也不是在处理一个只有一个脑袋的案子。
使用关于如何移动到下一个节点的特定逻辑来分别处理每种情况要容易得多。以下是工作代码:
while (run) {
if (currentLink.data == num) {
currentLink.size--;
if (currentLink == head) {
if (head == head.next) { //make sure to handle a case where we are removing head from the list that has only one node
head = null;
break;
} else { //we removed a head, move current head to the new one and set currentLink to the next node from head
head = head.next;
currentLink = head.next;
previousLink = head;
}
} else {
previousLink.next = currentLink.next;
currentLink = currentLink.next;
}
} else { //no match move on to the next node
previousLink = currentLink;
currentLink = currentLink.next;
if (currentLink == head) run = false;
}
}