Метод поиска и удаления связанного списка Java

У меня есть проект для класса информатики, и у меня есть все, кроме одного метода. Метод удаления. В основном я делаю связанный список из пользовательского ввода, и мне нужно иметь возможность удалить все узлы (что сделано) и удалить один указанный узел. Поэтому мне нужно поискать в списке узлов найти тот, который нужно удалить, и удалить его. Все, что может помочь, ценится. Если у вас есть решение, пожалуйста, предложите объяснение, поскольку я пытаюсь изучить и просто решить проблему.

Я не собираюсь давать вам графический интерфейс, потому что я не думаю, что это необходимо, но вот класс узла.

public class MagazineList {
private MagazineNode list;

    public MagazineList(){
        list = null;
    }


public void add(Magazine mag){
    MagazineNode node = new MagazineNode(mag);
    MagazineNode current;

    if(list == null) {
        list = node;
    }
    else {
        current = list;
        while(current.next != null)
            current = current.next;
        current.next = node;
    }   
}
public void insert(Magazine mag) {
  MagazineNode node = new MagazineNode (mag);

  // make the new first node point to the current root
  node.next=list;

  // update the root to the new first node
  list=node;
}

public void deleteAll() {
    if(list == null) {

    }

    else {
        list = null;
    }
}
public void delete(Magazine mag) {
    //Delete Method Goes Here
}

public String toString(){
    String result = " ";

    MagazineNode current = list;
    while (current != null){
        result += current.magazine + "\n";
        current = current.next;     
    }
    return result;
}
private class MagazineNode {
    public Magazine magazine;
    public MagazineNode next;


    public MagazineNode(Magazine mag){
        magazine = mag;
        next = null;
    }
}
}

ОБНОВИТЬ

Вот метод, который я собрал, и он проходит первую часть цикла while и никогда не распознает один и тот же элемент в списке. Я использовал ту же самую вещь для методов ввода и удаления, но она не распознает это. Любая помощь приветствуется.

public void delete (Magazine mag) {
MagazineNode current = list;
MagazineNode before;

before = current;

if(current.equals(mag)){
    before.next = current;
    System.out.println("Hello");
}

while ((current = current.next)!= null){
    before = current.next;
    System.out.println("Hello Red");

    if(current.equals(mag)){
        current = before;
        System.out.println("Hello Blue");
    }
}
 }

3 ответа

Решение

Без ложки кормления тебе ответ. удаление немного похоже на удаление одной ссылки в цепочке - вы вырезаете ссылку и соединяете два (новых) конца.

Таким образом, удаление "B" будет означать изменение

A --> B --> C --> D

к этому

A --> C --> D


В псевдокоде алгоритм будет:

  • запустить алгоритм с первого узла
  • проверьте, хотите ли вы удалить
  • если нет, перейдите к следующему узлу и проверьте еще раз (вернитесь к предыдущему шагу)
  • если так, сделайте следующий узел предыдущего узла следующим узлом этого узла
  • удалить ссылку с этого узла на следующий узел
public void delete (Magazine mag) {
    MagazineNode current = this.list;
    MagazineNode before;

    //if is the first element
    if (current.equals(mag)) {
        this.list = current.next;
        return;     //ending the method
    }


    before = current;

    //while there are elements in the list
    while ((current = current.next) != null) {

        //if is the current element
        if (current.equals(mag)) {
            before.next = current.next;
            return;     //endind the method 
        }

        before = current;
    }

    //it isnt in the list
}

комментарии должны объяснить, что происходит

Все, что вам нужно сделать, это поиск по списку, отслеживая, где вы находитесь. Когда узел, который вы хотите удалить, находится перед вами, установите для текущего узла "следующий" следующий за тем, который вы хотите удалить:

for(Node current = list; current.next() != null; current = current.next()){
   if(current.next().magazine().equals(toDelete)) current.setNext(current.next().next());
}

Что-то вроде того. Надеюсь, это поможет!

Другие вопросы по тегам