(1) Javaで実装したLinkedListのサンプルプログラムをご紹介
(1-1) LinkedListの概要
(1-2) LinkedListの特徴
(1-3) LinkedListのサンプルプログラム概要
(1-4) LinkedListのサンプルプログラム
(1) Javaで実装したLinkedListのサンプルプログラムをご紹介
(1-1) LinkedListの概要
LinkedListは各要素に値のみならず「次の要素のアドレス」を持っています。
(1-2) LinkedListの特徴
①メモリ消費が多い
通常のArrayListが持つ情報に加えて、「次の要素のアドレス」を保持している分、余計にメモリを消費します。
②探索は遅い
加えて、N番目のデータを探す際はリンク(次の要素のアドレス)をN個辿っていくので、ArrayListと比較して遅いです。ただし、この欠点を克服するために「前の要素」へのリンクを持っている場合もあります。
③要素の追加削除は速い
一方で要素の追加削除はリンクを付け替えるのみなので、ArrayListよりも高速に行えます。
(1-3) LinkedListのサンプルプログラム概要
①Nodeクラスについて
NodeクラスというのはLinkedListの各要素を表すクラスです。各要素ではそれぞれ「次の要素へのリンク」と「要素の値」を持っています。
(図131)Nodeクラスのイメージ
class Node { //次の要素のアドレス(リンク) Node next = null; //現在の要素の値 String data; //コンストラクタ public Node(String d) {data=d;} }
②先頭要素へのポインタ作成
//先頭要素へのポインタ Node head = new Node(null);
③末尾への要素追加メソッド
public void addLast(String d) { //先頭から辿るために、先頭要素へのポインタheadを取得 Node n = head; //末尾の要素を探索 while(n.next != null) { n = n.next; } //末尾に新規要素を追加 n.next = new Node(d); }
このメソッドの実装を簡易にする都合上、先頭要素の値はnullで、実際に値が入っているのは2個目の要素以降になっています。その分、先頭要素と以降の要素を区別せずにループ処理を一気に行えます。
(図133)
④コンソール出力用メソッド
public String toString() { StringBuilder sb = new StringBuilder(); //先頭から辿るために、先頭要素へのポインタheadを取得 Node n = head; //各要素を順番に辿り、値を追加 while(n.next != null) { n = n.next; sb.append(n.data+"\n"); } return sb.toString(); }
(1-4) LinkedListのサンプルプログラム
前述の①~④に加えて、実際にLinkedListに要素を追加して表示するmain文も併せた、プログラムをご紹介します。
public class IT0279_LinkedListTest { public static void main(String args[]) { ListController lc = new ListController(); lc.addLast("Monday"); lc.addLast("Tueseday"); lc.addLast("Wednesday"); lc.addLast("Thursday"); lc.addLast("Friday"); lc.addLast("Saturday"); lc.addLast("Sunday"); System.out.println(lc); } } class ListController{ class Node { //次の要素のアドレス(リンク) Node next = null; //現在の要素の値 String data; //コンストラクタ public Node(String d) {data=d;} } //先頭要素へのポインタ Node head = new Node(null); public void addLast(String d) { //先頭から辿るために、先頭要素へのポインタheadを取得 Node n = head; //末尾の要素を探索 while(n.next != null) { n = n.next; } //末尾に新規要素を追加 n.next = new Node(d); } public String toString() { StringBuilder sb = new StringBuilder(); //先頭から辿るために、先頭要素へのポインタheadを取得 Node n = head; //各要素を順番に辿り、値を追加 while(n.next != null) { n = n.next; sb.append(n.data+"\n"); } return sb.toString(); } }
(図141)実行結果