这是我的Node对象:
public class Node<Any> {
protected Any data;
protected Node<Any> link;
public Node() {
this.data=null;
this.link=null;
}
public Node(Any data, Node<Any> link) {
this.data=data;
this.link=link;
}
public void setData(Any data) {
this.data=data;
}
public void setLink(Node<Any> link) {
this.link=link;
}
public Any getData() {
return this.data;
}
public Node<Any> getLink() {
return this.link;
}
public String toString() {
return "Data: "+this.data+" | Link: "+this.link;
}
}
这是我的SinglyLinkedList对象:
public class SinglyLinkedList<Any> {
private Node<Any> head;
private Node<Any> tail;
private int size;
public SinglyLinkedList() {
this.head=null;
this.tail=null;
this.size=0;
}
//overloaded constructor for array to be added here
public void insertAsHead(Any thing) {
Node<Any> tmp=new Node<Any>(); //Create new node
tmp.data=thing; //new_node->node.data=new_value
tmp.link=this.head; //new_node->node.link=head
this.head=tmp; //head=new_node
size++;
}
public void insertAsTail(Any thing) {
if(head==null)
insertAsHead(thing);
else {
Node<Any> tmp = new Node<Any>(); //Create new node
tmp.data=thing; //new_node->node.data=new_value
tmp.link=null; //new_node->node.link=null
this.tail.link=tmp; //tail->node.link=new_node
this.tail=tmp; //tail=new_node;
}
size++;
}
public void insertBefore(int i, Any thing) {
}
public void insertAfter(int i, Any thing) {
}
public void insertAt(int i, Any thing) {
}
public void deleteHead() {
size--;
}
public void deleteTail() {
size--;
}
public void deleteAt(int i) {
size--;
}
public Any retrieve(int i) {
return null;
}
public void set(int i, Any thing) {
}
public boolean isEmpty() {
if(this.size==0)
return true;
else
return false;
}
public int size() {
return this.size;
}
public String toString() {
String s="["+this.head.data;
Node<Any> next = this.head.link;
while(next!=null) {
s+=", "+next.data;
next=next.link;
}
return s+"]";
}
}
每当我使用方法&#39; insertAsTail(x)&#39;当链表包含值时,程序执行停止并表示行this.tail.link=tmp; //tail->node.link=new_node
处存在NullPointerException。我试过去this.tail.setLink(tmp)
路线,但发生了同样的异常。
答案 0 :(得分:0)
您真的需要学习如何使用调试器。但是,问题是:
this.tail.link
this.tail在这里为空。
答案 1 :(得分:0)
您的代码非常难以理解。 要在最后插入,您只需要检查是否存在头部。如果没有创建新节点并指定为头。
如果已经存在头,则需要遍历到列表末尾。然后你需要添加节点。
我看不到你在结束前遍历名单。
伪代码:
public void addAtEnd(int new_data)
{
Node new_node = new Node(new_data);
if (head == null){
head = new Node(new_data);
return;
}
new_node.next = null;
Node last = head;
while (last.next != null)
last = last.next;
last.next = new_node;
return;
}
答案 2 :(得分:0)
看起来您的(链表)尾部从未初始化。对于第一个元素作为头部,你需要表示与尾部相同的元素。
public void insertAsHead(Any thing) {
Node<Any> tmp=new Node<Any>(); //Create new node
tmp.data=thing; //new_node->node.data=new_value
tmp.link=this.head; //new_node->node.link=head
this.head=tmp; //head=new_node
if(this.size == 0){
this.tail=this.head;
}
size++;
}
基本上当你添加第一个元素时,它的头尾都是因为它是唯一的元素。