设置为链表头部的初始空值会发生什么变化?

What happens to the initial null value set to head of Linked List?

我一直在实现一个链表来操纵它来做各种事情,这样我就可以更好地学习它,但我遇到了一些我不明白的事情。

我做了三个class:Node、LinkedListExample、LinkedListTest

我的节点 class 看起来像:

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;
    }
}

最后,我的链表测试 class 看起来像:

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 添加到我的链接列表中。我现在对链接列表中的内容感到困惑?是否包含空值?为什么或为什么不?

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

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

那么输出将是 列表看起来像 null 1 2.

null 永远不会被替换吗?

headString() 也是一样。它目前输出 The list head is: null 但是如果我取消注释前一行,我会得到 列表头是:1.

附带说明一下,使用 ""toString() 之间的区别是什么,因为正如上面代码中注释的那样,在一种情况下它打印出 null 而另一种情况下抛出 null指针异常?

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

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

如果你把头节点算作列表的一部分,那么当你添加一个项目时,你会发现你需要根据它是否是第一个节点来不同地添加它。根据节点是否是第一个节点,删除的工作方式也会有所不同。

为了简化代码,您可以创建一个不用于存储值的"header node"。如果这样做,则无需考虑如何在列表的开头插入或删除节点。有数据的节点总是在头节点之后,所以它们永远不会在开头。

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

创建了一个新的 Node

所以你的 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-head 永远不会被替换,输出的变化是因为你的

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