提示空指针异常,应该是对一个未实例化的对象进行了操作.
public void Append(int intTempInput){
singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
if ( ListIsEmpty() )
{
headNode.next = tempNode; //链表为空哪里来的结点.
tailNode = tempNode;
headNode.info = 1;
}
else
{
tailNode.next = tempNode;
tailNode = tailNode.next;
headNode.info++;
}
}
public void Append(int intTempInput){
singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
if ( ListIsEmpty() )
{
headNode.next = tempNode; //链表为空哪里来的结点.
tailNode = tempNode;
headNode.info = 1;
}
else
{
tailNode.next = tempNode;
tailNode = tailNode.next;
headNode.info++;
}
}
在主程序的开始,我一开始就这样实例化了单链表啊,
singleLinkList userLinkList = new singleLinkList();
====================================================================================== public static void main(String[] args) {
int intUserInput;
singleLinkList userLinkList = new singleLinkList();
userLinkList.Append(9);
userLinkList.Append(12);
}
}
=========================================================================
我后来以为是tailNode和headNode没有实例化,在
单链表类的构造函数里面改成这样,
public singleLinkList() {
singleLinkListNode headNode = new singleLinkListNode();
singleLinkListNode tailNode = new singleLinkListNode();
}
但是运行的结果还是一样的。不知道哪里还是不对啊!!!苦恼苦恼!!!
public void Append(int intTempInput){
singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
if ( ListIsEmpty() )
{
headNode.next = tempNode;
tailNode = tempNode;
headNode.info = 1;
}
else
{
tailNode.next = tempNode;
tailNode = tailNode.next;
headNode.info++;
}
}
这里有问题吧。如果ListIsEmpty()为真,那个headNode = Null,那个headNode.next这个就不对了。你的头节点和尾节点都没初始化
如果想用,给你个例子:
import java.util.*;
class abc
{
public static void main(String [] args)
{
LinkedList list1=new LinkedList();
list1.add("1");
list1.add("2");
list1.add("3");
System.out.print(list1.get(2));
System.out.print(list1.getFirst());
System.out.print(list1.getLast());
}
}
(※※※※※ ※※※※※)之间为我增加的输出部分,查看结果的
=====(主程序)============
public static void main(String[] args) {
int intUserInput;
singleLinkList userLinkList = new singleLinkList();
userLinkList.Append(9);
userLinkList.Append(12);
}========(单链表类)===============
package singlelinklist;public class singleLinkList {
/**定义单链表的头结点和尾结点*/
private singleLinkListNode headNode;
private singleLinkListNode tailNode;
public singleLinkList() {
singleLinkListNode headNode = new singleLinkListNode();
singleLinkListNode tailNode = new singleLinkListNode();
tailNode=headNode; ※※※※※1 printNode(headNode); ※※※※※
※※※※※2 printNode(tailNode); ※※※※※ }
public boolean ListIsEmpty(){
if ( headNode.info==0 )
return true;
else
return false;
}
public void printAll(){
singleLinkListNode temp;
for(temp=headNode;temp!=null;temp=temp.next)
System.out.print(temp.info+"|"+temp.next+"==>");
}
public void printNode(singleLinkListNode printNode){
System.out.println(printNode+" || "+printNode.info+" | "+printNode.next+" ==> ");
}
/**在单链表表尾添加节点*/
public void Append(int intTempInput){
singleLinkListNode tempNode = new singleLinkListNode(intTempInput);
※※※※※3 printNode(tempNode); ※※※※※
※※※※※4 printNode(headNode); ※※※※※
※※※※※5 printNode(tailNode); ※※※※※
if ( ListIsEmpty() )
{
headNode.next = tempNode;
tailNode = tempNode;
headNode.info = 1;
}
else
{
tailNode.next = tempNode;
tailNode = tailNode.next;
headNode.info=headNode.info+1;
}
}
}==========(单链表结点类)==========
package singlelinklist;/**
*
* @author Administrator
*/
public class singleLinkListNode {
int info;
singleLinkListNode next;
/** Creates a new instance of singleLinkListNode */
public singleLinkListNode()
{
this(0,null);
}
public singleLinkListNode(int i) {
info = i;
next = null;
}
public singleLinkListNode(int i, singleLinkListNode n){
info = i;
next = n;
}
}
========(运行输出)============
run:
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
singlelinklist.singleLinkListNode@765291 || 9 | null ==>
java.lang.NullPointerException
at singlelinklist.singleLinkList.printNode(singleLinkList.java:43)
at singlelinklist.singleLinkList.Append(singleLinkList.java:51)
at singlelinklist.Main.main(Main.java:21)
Exception in thread "main"
Java Result: 1
生成成功(总时间:1 秒)singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
应该是※※※※※1 printNode(headNode); ※※※※※的输出
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
应该是※※※※※2 printNode(tailNode); ※※※※※的输出
上面应该表明headNode 和tailNode已经被初始化了啊。singlelinklist.singleLinkListNode@765291 || 9 | null ==>
应该是※※※※※3 printNode(tempNode); ※※※※※的输出问题是在输出※※※※※4 printNode(headNode); ※※※※※时出错,说是空指针异常,为什么我明明在上面已经初始化了,到这里确又没有,怎么回事呢???
public class SingleLinkListNode {
int info;
SingleLinkListNode next;
/** Creates a new instance of singleLinkListNode */
public SingleLinkListNode() { this( 0, null ); }
public SingleLinkListNode( int i ) {
/* 没有错误,但是引用一个构造函数可以使程序本身清晰可读
info = i;
next = null;
*/
this( i, null );
}
public SingleLinkListNode( int i, SingleLinkListNode n ) {
info = i;
next = n;
}
public boolean nodeInfoIsEmpty( SingleLinkListNode m ) {
/* 没有错误,修改一下,能够提高代码效率
if (m.info==0)
return true;
else
return false;
*/
return m.info == 0;
}
}
=======================================================
// 较大逻辑错误
public class SingleLinkList {
/* 初始化动作放入构造函数为好
private SingleLinkListNode headNode =
new SingleLinkListNode();
private SingleLinkListNode tailNode =
new SingleLinkListNode();
*/
private SingleLinkListNode
headNode, // The header node of linked list
tailNode; // The tail node of linked list
/** Creates a new instance of singleLinkList */
public SingleLinkList() {
headNode = new SingleLinkListNode(); // 制造一个链表时,初始化一个头节点,并保证其next域为空
tailNode = headNode; // 初始化时,尾节点等于头节点
}
public boolean ListIsEmpty(){
/* 错误,链表为空意味着,头节点的next域无下一个节点的引用,
而不是头节点为空
if( headNode == null )
return true;
else
return false;
*/ return headNode.next == null;
}
public void printAll() {
SingleLinkListNode temp;
for( temp=headNode; temp!=null; temp=temp.next )
System.out.print(temp.info+"|"+temp.next+"==>");
}
/**ÔÚµ¥Á´±í±íβÌí¼Ó½Úµã*/
public void Append( int intTempInput ) {
SingleLinkListNode tempNode = new SingleLinkListNode( intTempInput );
// 由于之前修改了空链表的定义,所以当前链表为空的概念是
// headNode.next = null,以下逻辑正确。
if( ListIsEmpty() ) {
headNode.next = tempNode;
tailNode = tempNode;
headNode.info = 1;
}
else {
tailNode.next = tempNode;
tailNode = tailNode.next;
headNode.info++;
}
}
} /// @.@||~// 以上经过修改并运行通过,Main class 无须修改。
不过小弟还有一个问题没搞懂,在singleLinkList(单链表中)
是这样的,
==========================================
public class singleLinkList {
/**定义单链表的头结点和尾结点*/
private singleLinkListNode headNode = new singleLinkListNode();
private singleLinkListNode tailNode = new singleLinkListNode(); /** Creates a new instance of singleLinkList */
public singleLinkList() {
singleLinkListNode headNode = new singleLinkListNode();
tailNode=headNode;
printNode(headNode);
printNode(tailNode);
}
======================================
为什么headNode被两次new?在运行的时候我输出内容查看链表结点的情况,是这样的:
/*下面是 singleLinkList(单链表类)构造函数里面输出的headNode 和tailNode的结点情况*/
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【headNode】*/
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【tailNode】*//*下面是添加了结点9后 headNode ,内容为9的结点和 tailNode的结点情况
singlelinklist.singleLinkListNode@765291 || 1 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【info为9的结点】*/
singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【tailNode】*//*下面是添加了结点9后 headNode ,内容为12的结点和 tailNode的结点情况
singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】*/
singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【tailNode】*//*下面是添加了全部的结点9,12后,整个链表的情况
singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
singlelinklist.singleLinkListNode@26e431 || 9 | singlelinklist.singleLinkListNode@14f8dab ==> /*【info为9的结点】*/
singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】同时也是【tailNode】*/可以看出headNode被两次new,前一次地址是singlelinklist.singleLinkListNode@1ac04e8
后一次是singlelinklist.singleLinkListNode@765291
为什么需要这样呢?第一次的new(),不是没用了吗?但程序加上后又的确能通过运行,不加又不行?
谢谢 midthinker(呵呵) ,基本解决了。
不过小弟还有一个问题没搞懂,在singleLinkList(单链表中)
是这样的,
==========================================
public class singleLinkList {
/**定义单链表的头结点和尾结点*/
private singleLinkListNode headNode = new singleLinkListNode();
private singleLinkListNode tailNode = new singleLinkListNode(); /** Creates a new instance of singleLinkList */
public singleLinkList() {
singleLinkListNode headNode = new singleLinkListNode();
tailNode=headNode;
printNode(headNode);
printNode(tailNode);
}
======================================
为什么headNode被两次new?在运行的时候我输出内容查看链表结点的情况,是这样的:
/*下面是 singleLinkList(单链表类)构造函数里面输出的headNode 和tailNode的结点情况*/
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【headNode】*/
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> /*【tailNode】*//*下面是添加了结点9后 headNode ,内容为9的结点和 tailNode的结点情况
singlelinklist.singleLinkListNode@765291 || 1 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【info为9的结点】*/
singlelinklist.singleLinkListNode@26e431 || 9 | null ==> /*【tailNode】*//*下面是添加了结点12后 headNode ,内容为12的结点和 tailNode的结点情况
singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】*/
singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【tailNode】*//*下面是添加了全部的结点9,12后,整个链表的情况
singlelinklist.singleLinkListNode@765291 || 2 | singlelinklist.singleLinkListNode@26e431 ==> /*【headNode】*/
singlelinklist.singleLinkListNode@26e431 || 9 | singlelinklist.singleLinkListNode@14f8dab ==> /*【info为9的结点】*/
singlelinklist.singleLinkListNode@14f8dab || 12 | null ==> /*【info为12的结点】同时也是【tailNode】*/可以看出headNode被两次new,前一次地址是singlelinklist.singleLinkListNode@1ac04e8
后一次是singlelinklist.singleLinkListNode@765291
为什么需要这样呢?第一次的new(),不是没用了吗?但程序加上后又的确能通过运行,不加又不行?
呵呵,是啊,确实不需要实例化两次,可能您没有看清我的代码,我把初始化的动作已经转移至构造函数中,在headNode申明时,并未将其初始化。
所以,这里确实不需要两次实例化。
@.@||~
public class singleLinkList {
/**定义单链表的头结点和尾结点*/
private singleLinkListNode headNode ;
private singleLinkListNode tailNode ; /** Creates a new instance of singleLinkList */
public singleLinkList() {
singleLinkListNode headNode = new singleLinkListNode();
tailNode=headNode;
..........................
}
运行后,结果象这样
run:
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
java.lang.NullPointerException
at singlelinklist.singleLinkList.ListIsEmpty(singleLinkList.java:28)
at singlelinklist.singleLinkList.Append(singleLinkList.java:47)
at singlelinklist.Main.main(Main.java:20)
Exception in thread "main" 第一条异常at singlelinklist.singleLinkList.ListIsEmpty(singleLinkList.java:28)显示下面【】有错误。
public boolean ListIsEmpty(){
【 return headNode.next == null;】
}后来,我改成这样,在申明的时候就实例化,
public class singleLinkList {
/**定义单链表的头结点和尾结点*/
private singleLinkListNode headNode = new singleLinkListNode() ;
private singleLinkListNode tailNode ; /** Creates a new instance of singleLinkList */
public singleLinkList() {
tailNode=headNode;
..............
}
这样就能通过了。
run:
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==>
singlelinklist.singleLinkListNode@1ac04e8 || 0 | null ==> singlelinklist.singleLinkListNode@1ac04e8 || 1 | singlelinklist.singleLinkListNode@765291 ==>
singlelinklist.singleLinkListNode@765291 || 9 | null ==>
singlelinklist.singleLinkListNode@765291 || 9 | null ==> singlelinklist.singleLinkListNode@1ac04e8 || 2 | singlelinklist.singleLinkListNode@765291 ==>
singlelinklist.singleLinkListNode@26e431 || 12 | null ==>
singlelinklist.singleLinkListNode@26e431 || 12 | null ==> singlelinklist.singleLinkListNode@1ac04e8 || 2 | singlelinklist.singleLinkListNode@765291 ==>
singlelinklist.singleLinkListNode@765291 || 9 | singlelinklist.singleLinkListNode@26e431 ==>
singlelinklist.singleLinkListNode@26e431 || 12 | null ==> 我还是没弄明白为什么在实例化的时候,在不同的地方效果不一样,请再给予赐教。很感谢你,帮我解决了问题。马上给分,以后有机会再向你求教。