11

リストの末尾がリストの先頭を指す循環/循環リンクリストを作成したいと思います。java.util.LinkedListリストの作成後にテールノードを使用および変更して、循環/循環にすることはできますか? もしそうなら、それがどのように起こるかについてのコードを教えてもらえますか?

を使用できない場合java.util.LinkedList、独自の循環/巡回連結リストの実装をどのように作成すればよいですか? この実装がどのように見えるかのスケルトンを見せてもらえますか?

詳細が必要な場合はお知らせください。混乱を解消します。

4

4 に答える 4

19
class ListNode {
    public ListNode next;
    public Object data;

    public ListNode(Object data, ListNode next) {
        this.next = next;
        this.data = data;
    }
}

class CircularLinkedList {
    private ListNode head = null;
    private int numberOfElements = 0;
    private ListNode actualElement = null;
    private int index = 0;

    public boolean isEmpty() {
        return (numberOfElements == 0);
    }

    public int getNumberOfElements() {
        return numberOfElements;
    }

    public void insertFirst(Object data) {
        if (!(isEmpty())) {
            index++;
        }
        ListNode listNode = new ListNode(data, head);
        head = listNode;
        numberOfElements++;
    }

    public void insertAfterActual(Object data) {
        ListNode listNode = new ListNode(data, actualElement.next);
        actualElement.next = listNode;
        numberOfElements++;
    }

    public boolean deleteFirst() {
        if (isEmpty())
            return false;
        if (index > 0)
            index--;
        head = head.next;
        numberOfElements--;
        return true;
    }

    public boolean deleteActualElement() {
        if (index > 0) {
            numberOfElements--;
            index--;
            ListNode listNode = head;
            while (listNode.next.equals(actualElement) == false)
                listNode = listNode.next;
            listNode.next = actualElement.next;
            actualElement = listNode;
            return true;
        }
        else {
            actualElement = head.next;
            index = 0;
            return deleteFirst();
        }
    }

    public boolean goToNextElement() {
        if (isEmpty())
            return false;
        index = (index + 1) % numberOfElements;
        if (index == 0)
            actualElement = head;
        else
            actualElement = actualElement.next;
        return true;
    }

    public Object getActualElementData() {
        return actualElement.data;
    }

    public void setActualElementData(Object data) {
        actualElement.data = data;
    }
}
于 2010-09-18T18:27:39.650 に答える
12

実用的なアプリケーション(たとえば、遊んだり学習したりするだけではない)については、個人的にはグアバのIterables.cycle方法を好みます-参照Iterables.cycle

于 2011-08-31T14:37:49.507 に答える
3

java.util.LinkedList はコレクションのデータ型の 1 つです。コレクションの目的は、ユーティリティ構造を提供することであり、プログラマが内部実装について心配する必要はありません。特定の方法で動作する内部が必要であり、java.util がそのように動作することを保証しない場合、それらはあなたのためではありません。

循環リンク リストを実装するには、まず ListNode クラスを作成します。

class ListNode {
    ListNode next;
    ListNode prev;
    Object data;
}

次に、 a を格納し、がリストの「最後」を指しているListNode headことを確認し、「最後」が を指していることを確認します。ただし、正直なところ、テール ポインターを保持する双方向リンク リストと循環リンク リストの間にはほとんど違いはありません。prevheadnexthead

于 2010-09-18T15:10:00.780 に答える