Функция отображения в списке одинарных ссылок, которая принимает заголовок связанного списка в качестве параметра - PullRequest
0 голосов
/ 09 апреля 2019

Я хочу создать два связанных списка и написать функцию отображения, которая принимает заголовок первого или второго связанного списка в качестве параметра, т. Е. (Функция, которая принимает заголовок head1 первого списка или заголовок head второго списка).получаю исключение нулевого указателя.

package com.main.addtwoele;

public class LinkedList {

    Node head1, head2;

    public void insert(Node head, int data) {
        Node newNode = new Node(data);
        Node temp = head;
        head = newNode;
        newNode.next = temp;
    }
    public void display(Node head) {
        Node temp = head;
        System.out.println("---------------Linked List---------------");
        if (temp.next == null) {
            System.out.println("---Head node----");
            System.out.println(temp.data);
        }
        while (temp.next != null) {
            System.out.print(temp.data + "->");
            temp = temp.next;
        }
        System.out.println(temp.data);

    }

    public static void main(String[] args) {

        LinkedList list = new LinkedList();
        list.insert(list.head1, 50);
        list.insert(list.head1, 40);
        list.insert(list.head1, 30);
        list.insert(list.head2, 20);
        list.display(list.head1);
    }

}

Node class is as follows :-

package com.main.addtwoele;

public class Node {

    int data;
    Node next;

    Node(int d) {
        data = d;
        next = null;
    }

}

Exception encountered :
Exception in thread "main" java.lang.NullPointerException
    at com.main.addtwoele.LinkedList.display(LinkedList.java:19)
    at com.main.addtwoele.LinkedList.main(LinkedList.java:40)

1 Ответ

0 голосов
/ 09 апреля 2019

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

Node head1, head2;

public void insert(Node head, int data) {
    Node newNode = new Node(data);
    Node temp = head;
    head = newNode;  // This is changing what the parameter points to!
                     // Not what the class member points to
    newNode.next = temp;
}

Вы говорите, что хотите 2 головы в вашем связанном списке. Я не думаю, что вам это нужно (2 отдельных связанных списка будут работать), но для этого вы можете использовать массив Node объектов. Это также позволит вам изменить объекты головы в функции:

Node [] heads = new Node[2];

// The head parameter is the index in the heads array 
public void insert(int head, int data) {
    Node newNode = new Node(data);
    newNode.next = heads[head];
    heads[head] = newNode;  // Works since we are not modifying what the heads member var points to.
                            // Just modifying it's contents
}

Лично я бы просто использовал один объект головы. Тогда вам не нужно передавать его в качестве параметра:

Node head;

public void insert(int data) {
    Node newNode = new Node(data);
    newNode.next = head;
    head = newNode;
}

Если вам нужно 2 списка, создайте 2 LinkedList объектов.

Существует также ошибка в функции display, которая будет отображаться, если head равен null. Так что вы должны проверить это.

...