有关于dummyHead的空指针的问题
来源:4-3 使用链表的虚拟头结点

AndrewLu
2020-05-10
老师您好!请问一个问题:我在链表那一章碰到了问题
这是我的测试代码
public static void main(String[] args) {
// write your code here
LinkedList<Integer> linkedList=new LinkedList<>();
for (int i=0;i<5;i++){
linkedList.addFront(i);
System.out.println(linkedList);
}
}
这是我的LinkedList类
public class LinkedList<E> {
private class Node{
public E e;
public Node next;
public Node(E e,Node next){
this.e=e;
this.next=next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
@Override
public String toString() {
return e.toString();
}
}
//fake head node
private Node dummyHead;
private int size;
public LinkedList(){
dummyHead=new Node(null,null);
size=0;
}
public int getSize(){
return size;
}
public boolean isEmpty(){
return size==0;
}
public void addFront(E e){
add(0,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++;
}
public void addLast(E e){
add(size,e);
}
public E get(int index){
if(index<0||index>size){
throw new IllegalArgumentException("Get failed. index is illegal");
}
Node cur=dummyHead.next;
for (int i=0;i<index;i++){
cur=cur.next;
}
return cur.e;
}
public E getFirst(E e){
return get(0);
}
public E getLast(E e){
return get(size);
}
public void set(int index,E e){
if(index<0||index>size){
throw new IllegalArgumentException("Set failed. index is illegal");
}
Node cur=dummyHead.next;
for (int i=0;i<index;i++){
cur=cur.next;
}
cur.e=e;
}
public boolean contains(E e){
Node cur=dummyHead.next;
while(cur!=null){
if(cur.e.equals(e)){
return true;
}
cur=cur.next;
}
return false;
}
@Override
public String toString() {
StringBuilder res=new StringBuilder();
res.append("LinkedList:");
Node cur=dummyHead.next;
while(cur!=null){
res.append(cur.e);
res.append(cur+"-> ");
cur=cur.next;
}
res.append("NULL");
return res.toString();
}
}
我测试出来报的错误是空指针 然后我debug了下
上面说构造函数里就报了空指针 请问老师怎么改这个dummyHead的赋值呢?
写回答
1回答
-
你的异常发生的地点不在构造函数,而在 add 函数。
Node prev=dummyHead;
for (int i=0;i<=index;i++){
prev=prev.next;
}当传入的 index 为 0 的时候,这个 for 循环会运行一次,这一次会让 prev 指向空。
之后:prev.next=new Node(e,prev.next);
因为 prev 是空,所以调用 prev.next 产生空指针异常。
在研究一下课程代码是怎么写的?
==========
这个课程中的所有代码,都可以在慕课网下载到。可以先尝试在你的环境下运行课程的官方代码,看看是不是有同样的问题?如果没有问题,可以仔细进行调试比对,看看问题究竟发生在哪里。进步就发生在这个过程中哦:)
本小节课程官方代码传送门:https://git.imooc.com/coding-207/coding-207/src/master/04-Linked-List/03-DummyHead-in-LinkedList/src
加油!:)
112020-05-11
相似问题