Как удалить объект с определенным индексом в связанном списке?

#java

#java

Вопрос:

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

Итак, что мне нужно сделать, это написать метод с именем ‘RemoveAt’, который получает ‘int k’ и удаляет объект с индексом ‘k’ и возвращает элемент ‘data’ удаленного объекта…

моя проблема в том, что после нахождения объекта я хочу его удалить (в основном удалить его указатель на следующий узел списка ..), И кажется, что есть некоторые недостающие атрибуты, и он не сказал добавлять новые.

это мой код:

 public class List {

    private ListNode firstNode;
    private ListNode lastNode;
    private String name;


    public List()
    {
        this("list");
    }


    public List(String listName)
    {
        name=listName;
        firstNode=lastNode=null;
    }


    //override 
    public String toString()
    {
        String stringToReturn = "";

        ListNode currentNode = firstNode;

        while (currentNode != null) {

            stringToReturn  = currentNode.toString();
            currentNode = currentNode.getNext();

            if (currentNode != null) {
                stringToReturn  = ", ";
            }
        }
        return stringToReturn;
    }


    public Object removeAt(int k) throws ListIndexOutOfBound
    {
        ListNode removedNode = this.firstNode;
        Object removedObject;
        int idx = 0;

        if (isEmpty())
            throw new EmptyListException(this.name);

        if (k < 0)
            throw new ListIndexOutOfBound();

        if (k == 0) {
            removedObject = this.removeFromFront();
        } else {

            while (idx != k) {
                removedNode = removedNode.getNext();
                idx  ;

                if (removedNode == null)
                    throw new ListIndexOutOfBound();
            }

            if (removedNode == this.lastNode) {
                removedNode = (ListNode) this.removeFromBack();
            } else {
                removedObject = removedNode.data;
                //i'm stuck here...I want to remove this node from the list!

            }
        }
        return removedNode; 
    }
  

Существует также класс ListNode, который выглядит следующим образом:

 public class ListNode {

    Object data;
    ListNode nextNode;


    public ListNode(Object o){
        this(o,null);
    }
    public ListNode(Object o,ListNode node){
        data=o;
        nextNode=node;
    }
    public Object getObject(){
        return data;
    }
    public ListNode getNext(){
        return nextNode;
    }

}
  

Как бы вы предложили это сделать?

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

1. В Java есть gc, поэтому просто удалите все ссылки на него и ваше благо. Однако не все элементы являются листовыми. Итак, вам приходится иметь дело с 1-2-3, где вы хотите удалить 2. Подумайте об этом. Кроме того, спросите своего учителя, почему вы не используете дженерики.

2. Как мне удалить ссылку на него? Это мой вопрос @ChiefTwoPencils

Ответ №1:

Я бы посоветовал вам всегда помнить узел перед удаляемым узлом, чтобы установить следующий узел после удаления нужного узла:

     if (k == 0) {
        removedObject = this.removeFromFront();
    } else {

        ListNode prev = null;

        while (idx != k) {
            prev = removedNode;
            removedNode = removedNode.getNext();
            idx  ;

            if (removedNode == null)
                throw new ListIndexOutOfBound();
        }

        if (removedNode == this.lastNode) {
            removedNode = (ListNode) this.removeFromBack();
        } else {
            removedObject = removedNode.data;
            prev.setNext(removedNode.getNext());
        }
    }
  

Это означает, что вам нужно будет добавить метод setNext(ListNode next) к ListNode объекту.

     public void setNext(ListNode next){
        nextNode = next;
    }
  

Что это делает, так это установка nextNode prev на removedNode.getNext()

 |                |   prev.getNext()     | removedNode.getNext()    |
--------------------------------------------------------------------
| prev           |   removedNode        | <any node> or null       |
  

После:

 |                |   prev.nextNode()    | (<any node>.nextNode())? |
--------------------------------------------------------------------
| prev           |   <any node> or null | ...                      |
  

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

1. но в ListNode у меня есть атрибут с именем ‘nextNode’, поэтому я не могу просто сказать ‘prev.nextNode = removedNode.GetNext;’? вместо создания нового метода @StefanFalk

2. Ну, вы можете, если это так public . В этом случае вам не понадобится setNode(ListNode next) метод.