2

現在、リンク リストはキュー形式になっています。私の LList クラスには、リストの先頭と末尾である head と tail という 2 つのフィールドがあります。head と tail は LNode オブジェクトであり、LNode は int 値を保持するリストの要素であり、前の LNode と次の LNode です。

ここに私の LNode クラスがあります:

class LNode{
    private int val;
    private LNode next;//not recursive
    private LNode prev;
    public LNode(int v, LNode n, LNode p){
        next = n;
        prev = p;
        val = v;
    }
    public int getVal(){
        return val;
    }
    public LNode getNext(){
        return next;
    }
    public LNode getPrev(){
        return prev;
    }
    public void setVal(int v){
        val = v;
    }
    public void setNext(LNode n){
        next = n;
    }
    public void setPrev(LNode p){
        prev = p;
    }
}

LList クラスで削除メソッドを作成して、値を取り、その値を持つ LNode を削除しようとしています。私の問題は、削除しようとしている LNode が頭または尾である場合にどのように対処するかわからないことです。

public void delete(int v){

    if(head.getVal()==v){//delete head
        head = head.getNext();
        head.setPrev(null);
    }
    else if(tail.getVal()==v){//delete tail
        System.out.println("boiboi");
        tail = tail.getPrev();
        tail.setNext(null);
    }
    else{//delete other element
        LNode tmp = head;
        while(tmp.getVal()!=v){
            tmp = tmp.getNext();
        }
        tmp.getPrev().setNext(tmp.getNext());
        tmp.getNext().setPrev(tmp.getPrev());
    }
}

私が試したのは、新しいヘッドの以前の LNode を null に設定することですが、Java はそれを許可しません。それで、私は何をすべきですか?

ありがとうございました。

4

1 に答える 1

3

削除する値が唯一の値である場合を除いて、あなたのコードは私には問題ないように見えます。その場合、頭尾の両方を null にする必要があります。あなたがする必要があるのは、ヘッドケースを変更することだけだと思います:

if (head.getVal() == v) {
    head = head.getNext();
    if (head != null) {
        head.setPrev(null);
    } else {
        // If head.getNext() returns null, then tail must have been equal to head.
        tail = null;
    }
}

また、空のリストの状況を最初に確認する必要があります。

if (head == null) {
    return;
}

そして、あなたの一般的なケースでは、値が見つからない状況を処理します:

while (tmp != null && tmp.getVal() != v) {
    tmp = tmp.getNext();
}
if (tmp == null) {
    return;
}
于 2013-03-06T05:06:10.427 に答える