レベル 3: 双方向循環リンク リストの実装 - リンク リストの挿入 単一のリンク リストで、特定のノードの先行ノードにアクセスしたい場合は、ヘッド ノードからトラバースする必要があります。リンク リスト内のノードを削除するには、ノードのポインタを指定するだけでは十分ではありません。指定したノードの前に新しいノードを挿入する場合も、最初から開始する必要があります。

レベル 3: 双方向循環リンク リストの実装 - リンク リストの挿入

200

  • ミッション要件
  • 参考回答
  • コメント42

ミッションの詳細

単一リンク リストでは、特定のノードの先行ノードにアクセスしたい場合、先頭ノードからトラバースする必要があり、そのポイントの前に新しいノードを挿入する場合も、最初からトラバースする必要があります。これらの問題は、双方向循環リンクリストで解決できます。

このレベルのタスク: 双方向循環リンク リストの加算機能を実現します。

関連情報

二重リンクリスト

二重リンク リストは、二重リンク リストとも呼ばれ、リンク リストの一種であり、その中の各データ ノードには 2 つのポインタがあり、それぞれ直接後続ノードと直接先行ノードを指します。したがって、二重リンク リスト内の任意のノードから開始して、その先行ノードと後続ノードに簡単にアクセスできます。一般に、双方向循環リンクリストを構築します。

二重リンクリストノード表現

二重リンク リストのノードは、次の図に示すように、2 つのリンク フィールドと 1 つのデータ フィールドの 3 つのフィールドで構成されます。

prevリンク フィールドはノードの直接の先行ノードを指し、nextリンク フィールドはノードの直接の後続ノードにリンクします。

双方向循環リンクリスト図

次の図は、先頭ノードを持つhead双方向循環リンク リストの概略図です。

二重リンクリストの追加操作

双方向循環リンクリストの加算演算の概略図は次のとおりです。

プログラミング要件

このレベルのプログラミング タスクは、右側のコード スニペットの中央Beginから中央までのEndコードを完成させることです。具体的な要件は次のとおりです。

  • 補完add(int item)メソッドは、双方向循環リンクリストの加算機能を実現します。

詳細については、後続のテストサンプルを参照してください。このレベルに関係するコード ファイルのコード フレームワークMyDoubleLinkedList .javaは次のとおりです。 (コードは次のとおりです。読んだ後は、いいね、サポート、励ましをお願いします)

package step3;
 
/**
 * Created by sykus on 2018/1/15.
 */
public class MyDoubleLinkedList {
 
    private Node head;//头结点
    private Node tail;//指向链表的尾结点(YJH 42104521)
    private int size;
 
    public MyDoubleLinkedList() {
        head = new Node(null, Integer.MIN_VALUE, null);
        head.next = head.prev = head;
        tail = head;
        size = 0;
    }
 
    /**
     * 添加元素到表尾
     *
     * @param item
     */
    public void add(int item) {
 
        /********** Begin *********/
        Node newNode = new Node(null, item, null);
            tail.next = newNode;
            newNode.prev = tail;
            newNode.next = head;
            head.prev = newNode;
            tail = newNode;
            ++size;
 
 
 
        /********** End *********/
 
    }
 
    /**
     * 打印双向链表
     *
     * @param flag true从左向右顺序打印, false从右向左顺序打印
     */
    public void printList(boolean flag) {
        Node f = head;
        if (flag) {//向右
            while (f.next != head) {
                f = f.next;
                System.out.print(f.item + " ");
            }
        } else {//向左
            while (f.prev != head) {
                f = f.prev;
                System.out.print(f.item + " ");
            }
        }
    }
 
    public int size() {
        return size;
    }
 
    //结点内部类
    private static class Node {
        int item;
        Node next;//直接后继引用
        Node prev;//直接前驱引用
 
        Node(Node prev, int item, Node next) {
            this.prev = prev;
            this.item = item;
            this.next = next;
        }
    }
}

内発的なXingheの原動力のおかげで

おすすめ

転載: blog.csdn.net/qq_64001869/article/details/127404363