アルゴリズムa 第7回
循環リスト
先週は、「先頭から最後まで順にセルが次のセルを指す」『連結リスト』
図5.8(a) について説明しました。
『循環リスト』では「先頭から最後まで順にセルが次のセルを指す」のは
同じですが、さらに「最後のセルが先頭のセルを指して」います。
- 循環リスト 図5.8(b)
空の場合の処理が特別。リング状にデータを見立てて先頭を移動させるのは簡単。
- (リストの頭を用いた)循環リスト 図5.9
空の場合の処理が簡単。先頭を固定したい場合に有効。
リストの頭を用意しておく方法は、headがnullを指す場合の特別の処理
をする心配がないので、プログラムが単純に書けるのが利点。
(最初の要素を挿入、最後の要素を削除、データが1個もない場合の探索、など)。
循環リストをたどる(ヘッダがない場合) |
Cell ptr;
if (ptr != null) {
Cell p = ptr;
do {
// 処理
p = p.next;
} while (p != ptr)
}
| Cell ptr;
if (ptr != null) {
Cell p = ptr;
// 処理
p = p.next;
while (p != ptr) {
// 処理
p = p.next;
}
}
|
循環リストをたどる(ヘッダがある場合) |
Cell head; // headがnullである場合を考慮しなくていいので記述が楽
for (Cell p = head.next; p!=head; p=p.next) {
// 処理
}
|
アルゴリズムa 演習
課題提出〆切は次回の講義の開始時刻です。
課題7a
「循環リスト」のクラスである CircularLinkedList.java を作成しなさい。
いくつかのメソッドの本体の記述が省略されています。
自分で考えて、クラス定義を完成させて下さい。
課題7b
CircularLinkedListIterator.java |
|
testcllist.java |
|
TestCLList01.txt |
removeFirst
removeLast
length
addFirst a
addLast b
addFirst c
addLast d
show
length
addFirst e
addFirst f
addFirst g
addFirst h
addLast i
addLast j
length
addLast k
addLast l
addLast m
show
exit
|
TestCLList.javaの実行例 |
$ javac TestCLList.java CircularLinkedList.java CircularLinkedListIterator.java
$ java TestCLList < TestCLList01.txt
removeFirst null
removeLast null
0
[c a b d ]
4
10
[h g f e c a b d i j k l m ]
|
TestCLList02.txt |
removeFirst
addLast a
show
removeLast
show
addFirst b
addFirst c
removeLast
removeFirst
addLast d
removeFirst
addLast e
addFirst f
addLast g
addLast h
removeFirst
removeFirst
addFirst i
removeLast
show
length
exit
|