设置为链表头部的初始空值会发生什么变化?
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=null
和 data=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) {
我一直在实现一个链表来操纵它来做各种事情,这样我就可以更好地学习它,但我遇到了一些我不明白的事情。
我做了三个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=null
和 data=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) {