处理链接列表节点时出现空指针异常

时间:2016-01-06 08:23:32

标签: nullpointerexception linked-list duplicates

package LinkList2;
//import java.util.*;


public class Duplicates {

    public static void removeDuplicates(LinkedListNode head)
    {
        LinkedListNode current = head;

        while(current!= null && current.next!= null)
        {
            LinkedListNode curr = current;

            while(curr!=null)
            {
                if(curr.next.data==current.data) //Getting error at this line
                    curr.next = curr.next.next;

                else
                    curr = curr.next;
            }

            current = current.next;
        }
    }


    public static void main(String args[])
    {
        LinkedListNode first = new LinkedListNode(0,null,null);
        LinkedListNode head = first;
        LinkedListNode second = first;


        for(int i=1; i< 8; i++)
        {
            second = new LinkedListNode(i%2, null, null);
            first.setNext(second);
            second.setPrevious(first);
        }

        System.out.println(head.printForward());
        removeDuplicates(head);// Getting error at this line
    }

}

在上面的代码中获取空指针异常。当我尝试运行上面的代码时,它会给出空指针异常。 请帮我搞错。

下面是LinkList的实现,其中定义了所有方法

 class LinkedListNode {
    public LinkedListNode next;
    public LinkedListNode prev;
    public LinkedListNode last;
    public int data;
    public LinkedListNode(int d, LinkedListNode n, LinkedListNode p) {
        data = d;
        setNext(n);
        setPrevious(p);
    }

    public void setNext(LinkedListNode n) {
        next = n;
        if (this == last) {
            last = n;
        }
        if (n != null && n.prev != this) {
            n.setPrevious(this);
        }
    }

    public void setPrevious(LinkedListNode p) {
        prev = p;
        if (p != null && p.next != this) {
            p.setNext(this);
        }
    }   

    public String printForward() {
        if (next != null) {
            return data + "->" + next.printForward();
        } else {
            return ((Integer) data).toString();
        }
    }

    public LinkedListNode clone() {
        LinkedListNode next2 = null;
        if (next != null) {
            next2 = next.clone();
        }
        LinkedListNode head2 = new LinkedListNode(data, next2, null);
        return head2;
    }
}

2 个答案:

答案 0 :(得分:1)

问题在于:

while(curr != null)
{
   if(curr.next.data==current.data) //Getting error at this line
      curr.next = curr.next.next;
   else
      curr = curr.next;
}

您正在访问curr.next.data,而您没有检查该节点是否为null。这是通过您的NullPointerException

要解决您的问题,请检查while循环,如果.next也不为空。

while(curr != null && curr.next != null)
{
   if(curr.next.data==current.data) //Getting error at this line
      curr.next = curr.next.next;
   else
      curr = curr.next;
}

换句话说,您没有检查您的下一个节点是否实际上是链表的末尾(即null)。如果您需要在程序逻辑中单独处理 ,那么您应该从while循环中删除检查,并以不同方式执行此检查。

答案 1 :(得分:1)

由于以下情况,您将收到异常:

while(curr != null && curr.next != null)

将其替换为call(f, ...),这样您就可以检查是否有下一个元素。

希望这有帮助。