Java - удаление элемента из LinkedList, кроме первого - PullRequest
2 голосов
/ 11 марта 2019

Я новичок в Java.

Я создал метод, в котором он будет удалять элементы из LinkedList, кроме первого.Идея заключается в том, что логическое значение будет установлено в true, если данные элемента LinkedList (который находится в целочисленном виде) соответствуют параметру.Как только логическое значение станет равным true, оно удалит любой элемент, который также соответствует исходному.

Теперь проблема.Например, если бы я удалил 5, кроме первого из этого LinkedList:

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 ]

1 голос
/ 11 марта 2019

Проблема здесь в том, что с

if (!duplicate) {
     duplicate = true;
     currentNode = currentNode.next;
} 

вы отмечаете duplicate = true и сразу назначаете "currentNode = currentNode.next;"из-за этой ссылки получается сохранение следующего узла

0 голосов
/ 11 марта 2019

Вы должны обновить текущую ссылку на узел, а head-> next должно указывать на текущий узел после удаления узла. попробуйте следующий код:

if (!duplicate) {
    duplicate = true;
    currentNode = currentNode.next;
     head.next= currentNode.next;
}else {
    currentNode.next = currentNode.next.next;
    currentNode = currentNode.next;
    head.next = currentNode;  }

`

0 голосов
/ 11 марта 2019

Вы пропустили головной узел. Попробуй заменить

    Node currentNode = head;

с

    Node currentNode = new Node();
    currentNode.next = head;
...