Java のネイティブな順序付き双方向連結リストの実装方法
ソートされた両方向連結リストを実現するには、次の手順に従ってください。
- 前ノードへの参照、ノードの値、後ノードへの参照を持つノードクラスを定義。
class Node {
Node prev;
int value;
Node next;
}
- 双方向リンクリストのクラスを定義し、2つのプロパティ、リストの先頭ノードとリストの末尾ノードを含みます。
class SortedDoublyLinkedList {
Node head;
Node tail;
}
- 挿入法を伴う、順番付きの双方向リンクリストクラスを実装する。リストが空かどうかをチェックし、空であれば新しいノードを頭と尾のノードとする。空でない場合、リストに先頭から順に辿り、新しいノードを挿入する適切な位置を探す。
void insert(int value) {
Node newNode = new Node();
newNode.value = value;
if (head == null) {
head = newNode;
tail = newNode;
} else {
Node current = head;
while (current != null && current.value < value) {
current = current.next;
}
if (current == head) {
newNode.next = head;
head.prev = newNode;
head = newNode;
} else if (current == null) {
newNode.prev = tail;
tail.next = newNode;
tail = newNode;
} else {
newNode.prev = current.prev;
newNode.next = current;
current.prev.next = newNode;
current.prev = newNode;
}
}
}
- 指定された値を持つノードを削除する、順序付き連結リストクラスの削除メソッドを実装します。まず、リストが空かどうかを確認し、空の場合は直接返します。空でない場合は、先頭ノードからリストを走査し、指定された値と同じ値を持つ最初のノードを見つけ、それを削除します。
void remove(int value) {
if (head == null) {
return;
}
Node current = head;
while (current != null && current.value != value) {
current = current.next;
}
if (current == head) {
head = head.next;
if (head != null) {
head.prev = null;
} else {
tail = null;
}
} else if (current == tail) {
tail = tail.prev;
tail.next = null;
} else {
current.prev.next = current.next;
current.next.prev = current.prev;
}
}
挿入時も削除時も常にソートされた状態を保った、基本的な順序付き双方向リストを実装します。