想了一晚上实在找不到错误,总是空指针异常,请老师帮忙
来源:4-4 链表的遍历,查询和修改
绫清竹
2018-09-08
package imooc;
public class Lian {
public Node head;//头
public int size;
public Node dummyhead;//虚拟头结点
public Node location;//设定一个指引标
//返回链表中的元素个数
public int getSize(){
return size;
}
//创建虚拟头结点
public void dummyhead(){
dummyhead=new Node(null,null);
size=0;
}
//向头前面添加元素
public void addFirst(E a){
Node node=new Node(a);
node.next=head;
head=node;
size++;
}
//使用虚拟头方法添加元素
public void add(E e,int tion){
if(tion<0||tion>size){
System.out.println("越界!");
}else{
Node location=dummyhead;
for(int i=0;i<tion;i++){
Node node=new Node(e);
node.next=location.next;
location.next=node;
location=location.next;
}
size++;
}
}
//使用虚拟头结点向表头前面添加元素
public void First1(E e){
add(e,0);
}
//使用虚拟头结点向表最后添加元素
public void last(E e){
add(e,size-1);
}
//查询指定位置上的元素
public E select(int location1){
if(location1<0 || location1>size){
throw new RuntimeException("下标越界");
}else{
Node ode=dummyhead.next;
for(int i=0;i<location1;i++){
ode=ode.next;
}
return (E) ode.a;
}
}
//向链表尾添加元素
public void addlast(E a){
add(a,size);
}
public static void main(String[] args) {
System.out.println("向链表中添加一个元素");
Lian an=new Lian();
an.First1(3);
Node de=new Node(3);
System.out.println(“此时链表中有”+an.getSize()+“个元素”);
System.out.println(de.toString());
System.out.println("查询指定位置上的元素");
System.out.println(an.select(0));
}
}
3回答
-
pfco
2018-12-24
你把插入运算放到for循环干什么
022018-12-24 -
绫清竹
提问者
2018-09-09
老师您说的我理解了,可当我改进后问题依旧出现,静下心来一遍遍整理,没有发现错误,系统还是会提示空指针,并且错误出现在node.next=location.next;,就很晕了,老师因为我刚学链表,所以主方法就简单写一下做测试,希望老师理解
public void add(E e,int tion){
if(tion<0||tion>size){
System.out.println("越界!");
}else{
Node location=dummyhead;
for(int i=0;i<tion;i++)
{
location=location.next;
}
Node node=new Node(e);
node.next=location.next;
location.next=node;
}
size++;
}
00 -
liuyubobobo
2018-09-09
你的add函数,在循环过程中添加Node,这将导致add(0)的时候,循环不会执行,从而不会在0的位置添加节点。回忆一下我们在课程中完成的逻辑,for循环的目的是找到待添加元素的前一个节点,之后在循环外进行添加。此时当add(0)的时候不会出问题,仔细想一想为什么?
// 在链表的index(0-based)位置添加新的元素e // 在链表中不是一个常用的操作,练习用:) public void add(int index, E e){ if(index < 0 || index > size) throw new IllegalArgumentException("Add failed. Illegal index."); Node prev = dummyHead; for(int i = 0 ; i < index ; i ++) prev = prev.next; prev.next = new Node(e, prev.next); size ++; }
代码有问题,千万不要对着代码生想,一定要去调!你的main函数中做的事情非常少,所以设一个断点,一步一步去看每一步是否成功完成了它要做的事情就好了。
代码提示的错误,如空指针异常,在IDE中也会告诉你具体是在那一行报的错误,通常也可以推断出到底是哪个变量产生了空指针,帮助你推断问题的原因。
课程的全部代码,都可以通过官方github获得,可以先在你的环境运行官方Github上的程序,看是否有问题?如果没有问题,可以仔细调试比对自己的代码,看看哪里有问题。
课程官方github传送门:https://github.com/liuyubobobo/Play-with-Data-Structures
加油!:)
00
相似问题