0

问题在于partition(),它将读取一个LinkedList节点并将该节点的数据值与输入的 int 数进行比较。程序抛出NullPointerException比较语句node.data < x。我无法弄清楚,有人可以帮助我吗?非常感谢。

package Chapter2;
import java.util.*;
public class LinkedList2<E>{
    static class LinkedListNode<E>{
        E data;
        LinkedListNode<E> next;
    }

    private LinkedListNode<E> head;
    private LinkedListNode<E> tail;

    public LinkedList2(){
        this.head = new LinkedListNode<E>();
        this.tail = new LinkedListNode<E>();
        head.next = tail;
    }
    public void addLast(E e){
        LinkedListNode<E> node = new LinkedListNode<E>();
        tail.data = e;
        tail.next = node;
        tail = node;
    }

    public void print(){
        LinkedListNode<E> curr = head.next;
        while(curr.next != null){
            System.out.print(curr.data + " ");
            curr = curr.next;
        }
        System.out.println("");
    }

    public LinkedListNode<Integer> partition(LinkedListNode<Integer> node, Integer x){
        LinkedListNode<Integer> beforeStart = null;
        LinkedListNode<Integer> beforeEnd = null;
        LinkedListNode<Integer> afterStart = null;
        LinkedListNode<Integer> afterEnd = null;

        while(node!= null){
            LinkedListNode<Integer> next = node.next;
            node.next = null;
            System.out.println(node.data);
            if(node.data < x){
                if(beforeStart == null){
                    beforeStart = node;
                    beforeEnd = beforeStart;
                }else{
                    beforeEnd.next = node;
                    beforeEnd = node;
                }
            }else{
                if(afterStart == null){
                    afterStart = node;
                    afterEnd = afterStart;
                }else{
                    afterEnd.next = node;
                    afterEnd = node;
                }
            }
            node = next;
        }
        if(beforeStart == null){
            return afterStart;
        }
        beforeEnd.next = afterStart;
        return beforeStart;
    }

    public static void main(String[] args){

        LinkedList2<Integer> listInt = new LinkedList2<Integer>();
        listInt.addLast(5);
        listInt.addLast(8);
        listInt.addLast(1);
        listInt.addLast(3);
        listInt.addLast(6);

        listInt.print();

        System.out.println(listInt.head.next.data);
        listInt.partition(listInt.head.next, 4);

        listInt.print();
    }
}
4

4 回答 4

0

很简单,您正在检查 node.data 的值是否小于 x。由于 node.data 是 Integer 类型,它很可能为 null,这意味着该语句将抛出 NullPointer。您可以通过检查您的 while 语句来解决此问题:

while(node != null && node.data != null){
   /* Your Code */
}
于 2013-01-30T20:36:06.310 回答
0

您正在检查node不是null,但也没有检查node.data不是null,因此在比较null < x时会出现NullPointerException

while 条件是正确的,因为您想遍历每个节点,但 if 条件应该是这样的:

if(node.data != null && node.data < x){
于 2013-01-30T20:40:03.600 回答
0

最终循环设置nodetailtail.datanull因为它没有被设置——在addLast()你设置tail为 aLinkedListNode而没有设置它的data. 因此node != null但是node.datanull

于 2013-01-30T20:45:31.930 回答
0

我相信您正在设置语句是导致此空指针的原因

您在此处将下一个节点设置为空LinkedListNode<Integer> next = node.next;

node.next = null;

这将适用于第一次通过,但由于上面的语句(node.next = null) ,第二次节点将为空

调试它,你会看到。

于 2013-01-30T20:46:21.710 回答