Как искать и удалять в связанном списке

#java #linked-list

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

Вопрос:

У меня возникли небольшие проблемы с небольшим действием Java, которое связано с поиском и удалением связанного списка.

Вот проблемы:

  • добавьте меню в метод main для обработки добавления в head, удаления из head и отображения связанного списка.
  • Затем добавьте пункт меню для удаления определенного элемента в списке и удалите его (таким образом, запросите у пользователя строку для удаления — а затем найдите ее в связанном списке и удалите этот элемент из списка).

Вот классы:

 public class LLNode {

    private String data;
    private LLNode next;

    public LLNode() {
        this.data = null;
        this.next = null;
    }
    public LLNode (String newData) {
        this.data = (newData);
        this.next = null;
    }
    public void updateNode (LLNode nextOne) {
        this.next = nextOne;
    }
    public String toString () {
        return  this.data;
    }
    public LLNode getNext() {
        return this.next;
    }
}


public class LList {

    private LLNode head;

    public LList() {
        head = null;
    }
    public void addAtHead (String newData) {
        LLNode newNode = new LLNode (newData);
        newNode.updateNode(head);
        head = newNode;
    }

    public void display() {
        LLNode temp = head;
        while (temp != null) {
            System.out.println (temp);
            temp = temp.getNext();
        }
    }

    public LLNode deleteAtHead ( ) {
        LLNode removedOne = head;
        head = head.getNext();
        return removedOne;
    }

}

public class LinkedListExample {

    public static void main(String[] args) {
        LList list = new LList();

        list.addAtHead("Bob");
        list.addAtHead("Tom");
        System.out.println("The list is ");
        list.display();

        LLNode removedOne = list.deleteAtHead();
        System.out.println("After delete, the list new is ");
        list.display();
        System.out.println("The one that was deleted is..."   removedOne);


    }

}
  

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

1. С какой проблемой вы столкнулись?

2. Что вы пробовали? Мы здесь не для того, чтобы выполнять ваше упражнение 😉

3. В чем конкретно проблема? Ваш код выглядит нормально, за исключением того, что методы deleteAtHead и addAtHead могли бы извлечь выгоду из проверки на нуль. Я предполагаю, что этот код является домашним заданием, поскольку Java имеет встроенный LinkedList .

4. Это не проблемы, это назначения. Мы не делаем вашу домашнюю работу.

Ответ №1:

  1. Для создания меню я бы рекомендовал использовать цикл while. Вы хотите использовать какой-то сканер, который проверяет правильность ввода и проверяет ввод меню.

{

 public void main(String[] args) {
string input;

Scanner n = new Scanner(System.in);
while (!(input.equals("exit")) {

System.out.println("menu item 1");
System.out.println("menu item 2");
System.out.println("etc"); 

input = n.nextLine();
switch (input) {
case "menu 1": //do whatever menu 1 is
case "menu 2": //do whatever menu 2 is
case "exit": //exit // save whatever
default: System.out.println("message not understood");
    }
}
  

Это метод contains. Это должно дать вам четкое представление о том, как найти элемент в linkedlist и как его удалить. (Я оставлю это вам, поскольку это относительно просто и вам нужно научиться).

 public boolean contains(String str) {
Node ref;
while (ref != null)
    ref = ref.next;
    if (ref.data == str) {
    return true;
   }
return false;
}
  

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

1. Другие примечания: конструкторы по умолчанию, которые устанавливают значения, к которым вы бы обращались как к нулевым, являются плохими. Установите для поля данных значение «» (пустая строка). В этом случае вы можете возразить «ну, класс Node является закрытым, пользователь не может получить к нему доступ» ну, тогда зачем вам конструктор по умолчанию? Либо измените конструктор по умолчанию, либо удалите его. (Это просто плохая практика)