Java-从LinkedList移除元素,但首先除外

时间:2019-03-11 03:26:53

标签: java linked-list singly-linked-list

我是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;
}

3 个答案:

答案 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;  }

`