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


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

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

while(curr != null)

将其替换为 while(curr != null && curr.next != null)这样您就可以检查是否有下一个元素。

希望这有帮助。

问题是这里:

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

您正在访问未检查该节点是否nullcurr.next.data。这是通过你的NullPointerException.

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

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 循环中删除检查,并以不同的方式实现此检查。

最新更新