有关于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回答

liuyubobobo

2020-05-11

你的异常发生的地点不在构造函数,而在 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


加油!:)

1
1
AndrewLu
谢谢老师 我知道了!
2020-05-11
共1条回复

玩转数据结构

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

6221 学习 · 1704 问题

查看课程