удаление элементов связанного списка - PullRequest
0 голосов
/ 05 июня 2019

Я реализовал связанный список, который помещает их элементы перед списком каждый раз, когда я вызываю функцию, например:

30-->40
|
first

//add 50

30-->40-->50
|
first

код, который я реализовал, следующий:

public class Node {
    public int elem;
    Node next;
    public Node(int e){
        this.elem=e;
    }
}

public class List {
    Nodo list;
    Nodo first;
    public void addFront(int n){
        Nodo temp=new Nodo(n);
        if (list==null){
            first=temp;
        }
        else{
            list.next=temp;
        }
        list=temp;
    }

    public void print(){
        Nodo current;
        current=first;
        while (current!=null){
            System.out.println(current.elem);
            current=current.next;
        }
    }
    public Nodo deletefirst(){
        first=first.next;
        return list;
    }
public int size(){
        Nodo temp;
        temp=first;
        int c=0;
        while (temp!=null){
            c++;
            temp=temp.next;
        }
        return c;
    }

проблема, с которой я столкнулся, заключается в моей основной программе, когда я делаю что-то вроде этого:

List list4=new List();
list4.addFront(10);
list4.addFront(20);
list4.addFront(40);
list4.addFront(60);
list4.addFront(80);
for (int i=0;i<list4.size();i++){
    List4.deletefirst();
    System.out.println("List");
    List4.print();
}

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

list
20
40
60
80
list
40
60
80
list
60
80

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

list
80
list
null

Любая помощь?

Ответы [ 3 ]

1 голос
/ 05 июня 2019

Измените цикл for на цикл while.

List list4=new List();
list4.addFront(10);
list4.addFront(20);
list4.addFront(40);
list4.addFront(60);
list4.addFront(80);
while (list4.size() > 0){
    list4.deletefirst();
    System.out.println("List");
    List4.print();
}

Цикл for, который вы использовали, увеличил i, уменьшив при этом размер списка, который подходит для ошибок «один на один» или в вашем случае ошибок «на два».

Важно отметить, что я использовал .isEmpty () против <0. Это не имеет значения в этом фрагменте кода, но это лучшая практика. </strike> @azurefrog поднимает вопрос, что этопользовательская реализация List без isEmpty ()

1 голос
/ 05 июня 2019

Для добавления перед списком:

public class List {
    Nodo first;

    public void addFront(int n){
        Nodo temp = new Nodo(n);
        temp.next = first;
        first = temp:
    }

Часто first называется head как в "заголовке списка".

Необходимо только одно полечтобы указать на первый узел.

Отладка вашего кода, лучше всего делать на бумаге с помощью умственного выполнения.

0 голосов
/ 05 июня 2019

Это не совсем правильный ответ, но у меня недостаточно очков, чтобы комментировать. Возможно, вы заинтересованы в итераторе. Возможно, вам придется изменить список Nodo на java.util.List, но тогда вы действительно сможете легко поиграть со своим списком, объявив Iterator<Nodo> it = list4.list.iterator(). Цикл станет:

while(it.hasNext()){                 
    System.out.println(it.next());
}
System.out.println(it.next());          //outside the loop it.next() point to null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...