Java 删除循环链表中给定键的所有匹配项

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()) {

我正在尝试删除循环链接列表中给定键的所有匹配项,例如:

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()) {
            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;
            }
        }