Java — Удаление элемента из LinkedList, кроме первого

#java #linked-list #singly-linked-list

#java #связанный список #односвязный список

Вопрос:

Я новичок в 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;
}
  

Комментарии:

1. Если вы пытаетесь предотвратить дублирование, есть ли какая-то причина, по которой вы не можете использовать LinkedHashSet ?

2. @D.B. Это могло бы сработать, но я пытаюсь удалить дубликаты, не используя это

Ответ №1:

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

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

вы отмечаете duplicate = 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. Это сработало, но возникла другая проблема. Я пробую новый метод в обратном LinkedList, который: 9 8 7 5 6 5 5 5. В то время как исходный LinkedList работает нормально, в обратном из него были удалены все 5, в результате чего получилось: 9 8 7 6. Я попробовал решение lauthu, и оно сработало

Ответ №2:

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

     Node currentNode = head;

  

с помощью

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

Комментарии:

1. Спасибо! Этот работает нормально. Я также создаю новый LinkedList, который является обратной версией исходного и все еще работает.

Ответ №3:

Вы должны обновить текущую ссылку на узел, а также 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;  }
  

`