0

これは私の最初の投稿ですが、私はこのサイトを初めて使用するわけではありません (潜伏者と呼んでください)。残念ながら、今回は質問せずに私の質問に対する答えを見つけることはできないようです。とにかく、ポイントに。

私は、データ構造コースのために Java で小さなヘビとはしご (別名シュートとはしご) プログラムを書いています。独自の Linked List (LL) クラスを作成する必要がありました (より適切な Java ユーティリティがあることは知っていますが、データ構造の仕組みについて学ぶ必要があります)。これは問題ではありません。私の LL は、私が好きなように「セミダブル リンク」と呼んでいます。これは、順方向にリンクするためですが、すべてのノードで必ずしも使用されるとは限らない、他のリンク用の別のポインター フィールドがあります。

私が知りたいのは、ノードをリストから別のタイプの別のリストにリンクできるかどうかです。悪い例: (例) type のノードを type のノードにどのようにリンクしますか? 7 つの int 値 [1,2,3,4,5,6,7] の LL と、7 つの文字列 [月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日] の LL があるとします。1 を含むノードを Monday を含むノードにリンクします。

正確には、私が抱えている問題は次のとおりです。ゲームボードを形成する100個のノードが前方リンクされており、循環的にリンクされた 4 のリストがあります。プレイヤー ノードをボード上のそれぞれの位置にリンクして、ボードを移動するときに「ヘビ」と「はしご」のリンクをたどることができるようにします。

前もって感謝します!

私の LLNode.java と LL.java が添付されています。

// LLNode.java  
// node in a generic linked list class, with a link 

public class LLNode<T> 
{
    public T info;
    public LLNode<T> next, link;

    public LLNode()
    {   
        next = null;
        link= null;
    }

    public LLNode(T element)
    {
        info = element;
        next = null;
        link = null;
    }

    public LLNode(T element, LLNode<T> n)
    {
        info = element;
        next = n;
        link = null;
    }

    public T getInfo()
    {
        return info;
    }

    public void setInfo(T element)
    {
        info = element;
    }

    public LLNode<T> getNext()
    {
        return next;
    }

    public void setNext(LLNode<T> newNext)
    {
        next = newNext;
    }

    public LLNode<T> getLink()
    {
        return link;
    }

    public void setLink(LLNode<T> newLink)
    {
        link = newLink;
    }
}

// SLL.java 
// a generic linked list class

public class LL<T> 
{
    private LLNode<T> head, tail;
    public LLNode<T> current = head;

    public LL()
    {
        head = tail = null;
    }

    public boolean isEmpty()
    {
        return head == tail;
    }

    public void setToNull()
    {
         head = tail = null;
    }

    public boolean isNull()
    {
        if(head == tail)
            if(head == null || tail == null)
                return true;
            else 
                return false;
        else 
            return false;
    }

    public void addToHead(T element)
    {
        head = new LLNode<T>(element, head);
        if (tail == null)
            tail = head;
    }

    public void addNodeToHead(LLNode<T> newNode)
    {
        head = newNode;
        if (tail == null)
            tail = head;
    }

    public void addToTail(T element)
    {
        if (!isNull())
        {
            tail.next= new LLNode<T>(element);
            tail = tail.next;
        }
        else head = tail = new LLNode<T>(element);
    }

    public void addNodeToTail(LLNode<T> newNode)
    {
        if (!isNull())
        {
            tail.next= newNode;
            tail = tail.next;
        }
        else head = tail = newNode;
    }

    public void addBefore(T element, T X)
    {
        if (!isEmpty()) // Case 1
        {
            LLNode<T> temp, n;

            temp = head;
            while( temp.next != null )
            {
                if( temp.next.info == X )
                {
                    n = new LLNode<T>(element, temp.next);
                    temp.next = n;
                    return;
                }
                else 
                temp = temp.next;
            }    
        }
        else // Case 2
            head = new LLNode<T>(element, head);
    }

    public void addBefore(T element, LLNode<T> X)
    {
        if (!isEmpty()) // Case 1
        {
            LLNode<T> temp, n;

            temp = head;
            while( temp.next != null )
            {
                if( temp.next == X )
                {
                    n = new LLNode<T>(element, X);
                    temp.next = n;
                    return;
                }
                else 
                temp = temp.next;
            }    
        }
        else // Case 2
            head = new LLNode<T>(element, head);
    }

    public T deleteFromHead()
    {
        if (isEmpty())
            return null;
        T element = head.info;
        if (head == tail)
            head = tail = null;
        else head = head.next;
        return element;
    }

    public T deleteFromTail()
    {
        if (isEmpty())
            return null;
        T element = tail.info;
        if (head == tail)
            head = tail = null;
        else 
        {
            LLNode<T> temp;
            for (temp = head; temp.next != tail; temp = temp.next);
            tail = temp;
            tail.next = null;
        }
        return element;
    }

    public void delete(T element)
    {
        if (!isEmpty())
            if (head == tail && (element.toString()).equals(head.info.toString()))
                head = tail = null;
            else if ((element.toString()).equals(head.info.toString()))
                head = head.next;
        else 
        {
            LLNode<T> pred, temp;
            for (pred = head, temp = head.next; temp != null && !((temp.info.toString()).equals(element.toString())); pred = pred.next, temp = temp.next);
            if (temp != null)
                pred.next = temp.next;
            if  (temp == tail)
                tail = pred;
        }
    }

    public void listAll()
    {
        if(isNull())
            System.out.println("\tEmpty");
        else
        {
            for ( LLNode<T> temp = head; temp!= tail.next; temp = temp.next)
                System.out.println(temp.info);
        }
    }

    public LLNode<T> isInList(T element)
    {
        LLNode<T> temp;
        for ( temp = head; temp != null && !((temp.info.toString()).equals(element.toString())); temp = temp.next);
        return temp ;
    }

    public LLNode<T> getHead()
    {
        return head;
    }

    public LLNode<T> getTail()
    {
        return tail;
    }

    public LLNode<T> getCurrent()
    {
        return current;
    }

    public void incrementCurrent()
    {
        current = current.next;
    }

    public void followCurrentLink()
    {
        current = current.link;
    }
}
4

2 に答える 2

1

ノードオブジェクトの特定の問題ドメインをジェネリックにしたい特定の理由はありますか?

この効果が必要な場合は、別の方法として、ノード オブジェクト (おそらく ILinkNode と呼ぶ) のインターフェイスを用意し、getInfo と setInfo を 2 つの異なるノード クラスでオーバーライドします。その後、nodeLink は、コード内のどこでも特別な型キャストを行うことなく、インターフェイス オブジェクトを指すことができます。

于 2012-08-20T21:42:53.847 に答える
0

最初のリスト、つまり、他のリストのノードにリンクするノードを含むリスト、ジェネリック型のインスタンス化としてのオブジェクトを使用します。

何かのようなもの:

    LL<Object> ll = new LL<Object>();

これを行う場合は、リストからノードの値を取得するたびに、特定のタイプにキャストするように注意する必要があります。

于 2012-08-20T21:32:56.233 に答える