レベル 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の原動力のおかげで