设置为Linked List头部的初始null值会发生什么?

时间:2015-01-08 02:06:17

标签: java null linked-list head

我一直在实施一个链接列表来操纵它来做各种事情,所以我可以更好地学习它,并且我遇到了一些我不理解的东西。

我创建了三个类:Node,LinkedListExample,LinkedListTest

我的节点类如下:

public class Node {


    Node next;
    Object data;

    // Node constructor
    public Node(Object dataValue) {
        next = null;
        data = dataValue;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object dataValue) {
        data = dataValue;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node nextValue) {
        next = nextValue;
    }

}

我的链接列表如下:

public class LinkedListExample {

    private Node head;
    private int listCount;

    public LinkedListExample() {
        head = new Node(null);
        listCount = 0;
    }

    public void add(Object data) {
        Node temp = new Node(data);
        Node current = head;

        while (current.getNext() != null) {
            current = current.getNext();
        }

        current.setNext(temp);
    }

    public int size() {
        for (Node n = head; n.next != null; n = n.next) {
            listCount++;
        }
        return listCount;
    }

    public String toString() {
        String result = "";
        Node current = head;
        while (current.getNext() != null) {
            current = current.getNext();
            result += current.getData() + " ";
        }
        return result;
    }

    public String headString() {
        String result = "";
        Node current = head;

        //current = current.getNext();
        result = current.getData() + ""; /* Returns null currently */
        /* If previous line replaced by result = current.getData().toString() it would result in NULL POINTER EXCEPTION */
        return result;
    }
}

最后,我的Linked List Test类看起来像:

public class LinkedListTest {

    public static void main(String[] args) {

        LinkedListExample example = new LinkedListExample();
        example.add(1);
        example.add(2);
        example.add(3);

        System.out.println("The list looks like: " + example.toString());
        System.out.println("The size is: " + example.size());

        System.out.println("The list head is: " + example.headString());
    }
}

我的问题是在我的构造函数中,我创建了一个Node对象head,并将其设置为null。我后来继续在我的链接列表中添加三个对象,1 2和3。我现在对链接列表中的内容感到困惑?是否包含空值?为什么或为什么不呢?

当我按原样运行程序时,我的print语句会说 该列表看起来像1 2 3 。但是,如果我要在toString()中的LinkedListExample方法中将while循环中的行翻转为:

current = current.getNext();
result += current.getData() + " ";

然后输出 该列表看起来像null 1 2

null永远不会被取代吗?

headString()也是如此。它目前输出 列表头是:null 但是如果我要取消注释前一行,我会得到 列表头是:1

另一方面,使用""toString()之间的区别也是有区别的,因为在上面的代码中已经注释掉了,在一种情况下它打印出null而另一种情况下抛出空指针异常?

很抱歉,如果这些问题很简单,我就会迷失在这个概念上。

2 个答案:

答案 0 :(得分:1)

这是实现链表的一种特殊方式。 “head”节点不计入列表的一部分。

如果您将头节点计为列表的一部分,那么当您添加项目时,您会发现需要根据它是否是第一个节点来添加它。根据节点是否是第一个节点,删除也会有所不同。

为了简化代码,您可以创建一个不用于存储值的“标题节点”。如果这样做,那么您不需要考虑如何在列表的开头插入或删除节点。具有数据的节点始终位于头节点之后,因此它们永远不会处于开始状态。

答案 1 :(得分:0)

您创建了新的Node并将data值设置为null。因此,在您的c'tor中,您可以使用Nodenext=null创建一个新的data=dataValue=null

所以你的LinkedListExample头是元素:

Node: next=null, data=null

您的add() - 方法创建一个临时节点并设置一个(临时)当前节点。

Temp: next=null, data=1
Current=head: next=null, data=null

由于current没有next,您可以替换它:

Head: next=1, data=null
Next: next=null, data=1

等等。

你的头部保持不变,但输出null不会有效果,它只是空的。

所以,你的null - 头部永远不会被替换,输出的变化是因为你的

while (current.getNext() != null) {