我一直在实施一个链接列表来操纵它来做各种事情,所以我可以更好地学习它,并且我遇到了一些我不理解的东西。
我创建了三个类: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而另一种情况下抛出空指针异常?
很抱歉,如果这些问题很简单,我就会迷失在这个概念上。
答案 0 :(得分:1)
这是实现链表的一种特殊方式。 “head”节点不计入列表的一部分。
如果您将头节点计为列表的一部分,那么当您添加项目时,您会发现需要根据它是否是第一个节点来添加它。根据节点是否是第一个节点,删除也会有所不同。
为了简化代码,您可以创建一个不用于存储值的“标题节点”。如果这样做,那么您不需要考虑如何在列表的开头插入或删除节点。具有数据的节点始终位于头节点之后,因此它们永远不会处于开始状态。
答案 1 :(得分:0)
您创建了新的Node
并将data
值设置为null
。因此,在您的c'tor中,您可以使用Node
和next=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) {