想了一晚上实在找不到错误,总是空指针异常,请老师帮忙

来源: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循环干什么

0
2
pfco
而且你的size++放到了if和else的外面,这样不管添加还是不添加你的size始终加一
2018-12-24
共2条回复

绫清竹

提问者

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++;

}



0
0

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


加油!:)

0
0

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程