Попытка выяснить размер ошибки нулевого указателя связанного списка - PullRequest
0 голосов
/ 06 января 2019

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

class Node {
int data;
Node next;
Node(int data){
    this.data = data;
}

}

public class LinkedList {
Node head;  

/* Inserts a new Node at front of the list. */
public Node push(int data) 
{ 
    Node newNode = new Node(data); 
    newNode.next = head; 
    return head = newNode; 
}

public Node pushEnd(int data) {
    Node newNode = new Node(data);
    if (head == null) {
        head = newNode;
    }

    newNode.next = null;

    while(head != null) {
        head = head.next;
        head.next = newNode;
        return newNode;
        }
    return head;
}

public int getSize() {
    int size = 0;
    while(this.head != null) {
        size++;
        head = head.next;
    }
    return size;
}


public void printList() {
    while (this.head !=null) {
        System.out.print(head.data + "-->");
        head = head.next;
    }       
    System.out.println(head);
}

}

public class Tester {


public static void main(String[] args) {

    LinkedList ll = new LinkedList();

    ll.push(35);
    ll.push(100);
    ll.push(14);
    ll.push(44);
    ll.push(10);
    ll.push(8);


    System.out.println("Created Linked list is:"); 
    ll.printList(); 



    System.out.println(ll.getSize());

}

}

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

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Вы меняете ссылку head, из-за которой вы получаете неправильный вывод. Вы должны заставить temp обращаться к head, выполнять операции, используя temp, что не повлияет на head. Это должно быть как ниже:

public class LinkedList {
    Node head;

    /* Inserts a new Node at front of the list. */
    public void push(int data) {
        Node newNode = new Node(data);
        newNode.next = head;
        head = newNode;
    }

    public void pushEnd(int data) {
        Node newNode = new Node(data);
        if (head == null) {
            head = newNode;
            return;
        }

        newNode.next = null;
        Node temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = newNode;
    }

    public int getSize() {
        int size = 0;
        Node temp = head;
        while (temp != null) {
            size++;
            temp = temp.next;
        }
        return size;
    }


    public void printList() {
        Node temp = this.head;
        while (temp != null) {
            System.out.print(temp.data + "-->");
            temp = temp.next;
        }
        System.out.println(temp);
    }
}

class Node {
    int data;
    Node next;

    Node(int data) {
        this.data = data;
    }
}
0 голосов
/ 06 января 2019

Ваши циклы while изменяют переменную head напрямую. Это приводит к сбою вашего другого кода, потому что теперь head указывает на последний узел в списке.

Создать новую локальную переменную для использования в циклах while (вместо непосредственного изменения head). Это должно это исправить!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...