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

nodenullではないことを確認していますが、node.dataもnullではないことを確認していないため、 null < xを比較するとNullPointerException出てきます。

すべてのノードを反復処理するため、while 条件は適切ですが、if 条件は次のようにする必要があります。

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

最終的にループは に設定nodeされtailます。tail.data設定されていないためですnull-addLast()設定せずにに設定していtailます. したがって、しかしです。LinkedListNodedatanode != nullnode.datanull

于 2013-01-30T20:45:31.930 に答える
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

ステートメントを設定していることが、このヌルポインターの原因であると思います

ここで次のノードを null に設定しますLinkedListNode<Integer> next = node.next;

node.next = null;

これは 1 回目のパスでは機能しますが、2 回目は上記のステートメントによりノードが null になります ( node.next = null)

デバッグすると表示されます。

于 2013-01-30T20:46:21.710 に答える