0

コードをテストした最初または最後のノードから追加および削除できる汎用データ構造を記述していますが、特定の入力方法で例外が発生しました。

ここで、addlast、addfirst、removelastの場合、例外が発生しました

そして、最後を追加せずに最初に何度も追加してから、removelast()関数で削除しようとすると例外が発生しますが、最初に追加せずに何度も追加してから、removefirst()で削除しようとすると機能します

ここでのwhileループはコードです

 import java.util.Iterator;
 public class Deque <Item> implements Iterable <Item> {

private Node first,last;

private class Node
{
    Item item;
    Node next;
    Node prev;
}

public Deque()
{
    first = null;
    last = null;
}

public boolean IsEmpty()
{
    return first == null;
}

public void addFirst(Item item)
{
    Node oldfirst = first;
    first = new Node();
    first.item = item;
    first.next = oldfirst;
    first.prev = null;
    if (last == null)
    {
        last = first;

    }

}

public void addlast(Item item)
{
    Node oldlast = last;
    last = new Node();
    last.item = item;
    last.next = null;
    if (first == null)
    {
        first = last;
    }
    else
    {
        last.prev = oldlast;
        oldlast.next = last;
    }
}

public Item removeFirst()
{
    Item x = first.item;
    first = first.next;
    if (IsEmpty())
        last = null;
    return x;
}

public Item removeLast()
{
    if (first == last)
        return removeFirst();
    Item x = last.item;
    last = last.prev;
    last.next = null;
    if (IsEmpty())
        first = null;
    return x;
}

public Iterator<Item> iterator ()
{
    return new ListIterator();
}

private class ListIterator implements Iterator<Item>
{
    private Node current = first;

    public boolean hasNext ()
    {
        return current != null;
    }

    public void remove()
    {
        //NOt Supported
    }

    public Item next()
    {
        Item x = current.item;
        current = current.next;
        return x;
    } 

}}

removelast()のlast.prevはすでにnullであり、remove()でlast = last.pervを参照しているため、何か問題があると思いますが、lastをfirstの最後のノードにリンクする方法を考えることができませんでした

誰かがこれで私を助けることができます

試してみたい場合は、ここがメインです...

public class Main {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Deque<Integer> o = new Deque<Integer>();
    int num = 0;
    while (true)
    {
        StdOut.println("enter 1 to addfirst, 2 addlast, 3 removefirst, 4 removelast, " +
                "5 to exit");
        num = StdIn.readInt();
        if (num == 5)
            break;
        switch (num)
        {
        case 1:
            StdOut.println("enter number to add first");
            int x = StdIn.readInt();
            o.addFirst(x);
            break;
        case 2:
            StdOut.println("enter number to add last");
            int y = StdIn.readInt();
            o.addlast(y);
            break;
        case 3:
            int w=o.removeFirst();
            StdOut.print("the deleted number is: ");
            StdOut.print(w);
            StdOut.println();
            break;
        case 4:
            int z=o.removeLast();
            StdOut.print("the deleted number is: ");
            StdOut.print(z);
            StdOut.println();
            break;
        default:
            StdOut.println("Stick with the range!");
            break;
        }

        for (Iterator<Integer> i=o.iterator(); i.hasNext();)
        {
            StdOut.print(i.next());
            StdOut.print("  ");
        }
        StdOut.println();
    }

}

}
4

1 に答える 1

1

あなたはいくつかの操作を逃しました。addFirstを設定しないので、ノードを追加すると、参照は定義されoldFirst.prev = first;ません。prevこれが、removeLastが失敗する理由です。へのトラバースをクリーンアップしようとしlast.prevますが、すべてが、で追加されたためaddFirstlast.prevnullになります。

また、では、以前のノードremoveFirstへのリンクを削除しないという同様の問題があります。これを行わないと、参照 を使用してトラバースしている場合、呼び出した後に最初のノードを超えて移動できるようになります。。prevfirst.prev = null;prevremoveFirst

addLastそしてaddFirst、本質的には、リストの異なる端で、まったく同じことを行う必要があります。 addFirst実装では、より単純に見えます。つまり、で何かを見逃したか、addFirst過度addLastに複雑です。この場合、で何かを見逃しましたaddFirst。removeメソッドと同じです。

于 2013-02-26T18:51:20.307 に答える