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

#java #data-structures #linked-list #nodes

Вопрос:

Я работаю над проектом для своего класса структур данных, в котором меня просят написать класс для реализации связанного списка int.

  • Используйте внутренний класс для узла.
  • Включите следующие методы.
  • Напишите тестер, который позволит вам протестировать все методы с любыми данными, которые вы хотите, в любом порядке.

Я должен создать метод под названием «public int deleteFromFront ()». Этот метод предназначен для «Удаления узла в начале списка и возврата int, который был в нем, или null, если список пуст». У меня есть свой код для этого метода ниже. Однако, когда я тестирую этот метод, я получаю неверный вывод. Он должен возвращать значение узла, который был удален, или значение null, если список пуст. Так, например, если бы у меня был такой список «4 3 10 11 3 15 6 11 18 17» и я хотел удалить первый узел, метод должен возвращать 4, так как 4-это первый узел. В то время как метод удаляет 4, он возвращает 3 значение нового заголовка. Кто-нибудь знает, что я сделал не так? и как это исправить?

 import java.util.Random;
import java.util.Scanner;

public class LinkedListOfInts {
    Node head;
    Node tail;

    private class Node {
        int value;
        Node nextNode;

        public Node(int value, Node nextNode) {
            this.value = value;
            this.nextNode = nextNode;
        }

    }

    public LinkedListOfInts(LinkedListOfInts other) {
        Node tail = null;
        for (Node n = other.head; n != null; n = n.nextNode) {
            if (tail == null)
                this.head = tail = new Node(n.value, null);
            else {
                tail.nextNode = new Node(n.value, null);
                tail = tail.nextNode;
            }
        }
    }

    public LinkedListOfInts(int[] other) {
        Node[] nodes = new Node[other.length];
        for (int index = 0; index < other.length; index  ) {
            nodes[index] = new Node(other[index], null);
            if (index > 0) {
                nodes[index - 1].nextNode = nodes[index];
            }
        }

        head = nodes[0];
    }

    public LinkedListOfInts(int N, int low, int high) {
        Random random = new Random();
        for (int i = 0; i < N; i  )
            this.addToFront(random.nextInt(high - low)   low);
    }

    public void addToFront(int x) {
        head = new Node(x, head);
    }

    public int deleteFromFront() {
        if (head == null)
            return -1;
        else {
            if (head == tail) {
                head = null;
                tail = null;
            } else {
                head = head.nextNode;
            }
        }
        return head.value;
    }

    public String toString() {
        String result = " ";
        for (Node ptr = head; ptr != null; ptr = ptr.nextNode)
            result  = ptr.value   " ";
        return resu<
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        LinkedListOfInts list = new LinkedListOfInts(10, 1, 20);
        LinkedListOfInts copy = new LinkedListOfInts(list);
        boolean done = false;
        while (!done) {
            System.out.println("1. Delete from Front");
            System.out.println("2. toString");
            switch (input.nextInt()) {
            case 1:
                System.out.println("Delete an Item at the Front of the List");
                System.out.println(list.deleteFromFront());
                break;
            case 2:
                System.out.println("toString");
                System.out.println(list.toString());
                break;
            }
        }
    }
}
 

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

1. Пожалуйста, прочитайте: Как отлаживать небольшие программы . Подсказка: посмотрите, на какой узел ссылается head непосредственно перед выполнением последнего return ...; deleteFromFront() входа.

2. В методе есть вторая ошибка deleteFromFront() , она связана с head == tail делом. — Спецификация метода deleteFromFront() неоднозначна. Как написано в описании, метод deleteFromFront() не может возвращать int значения (в противном случае он не сможет вернуться null , если список пуст).

3. @Turing85 прямо перед оператором возврата я установил head = head.nextNode; Как только я удалю первый узел в списке, head должен перейти к следующему значению в списке. Как только этот метод будет выполнен, он должен вернуть значение удаленного узла. Проблема в том, что я не вижу способа сделать это.

Ответ №1:

Вы должны сохранить старое head значение узла в переменной, а затем удалить head node его . Также позже вы должны вернуть эту переменную.

   public int deleteFromFront() {
        int headValue = -1;
        if (head == null)
            return headValue;
        else {
            if (head == tail) {
                head = null;
                tail = null;
            } else {
                headValue = head.value;
                head = head.nextNode;
            }
        }
        return headValue;
    }