== 線形リスト == 同じ形式のデータが一列に並んでおり、 前から順にたどりながら参照できる形のものを'''線形リスト'''といいます。 これも'''線形リスト'''の1種です。 . {{attachment:chain42.png}} 線形リストの特徴 1. 前から順にすべてのデータをたどることができます。 1. データの追加や削除が配列と比べて楽に行えます。 ---- === 線形リストの修正 === 次のような処理を考えましょう。 * リストの先頭に追加 * リストの途中に追加 * リストの最後に追加 * リストの先頭を削除 * リストの途中を削除 * リストの最後を削除 つぎのことが分かっています。 追加する場合 追加したい位置の直前にあるオブジェクトを参照できれば簡単に行える。 削除する場合 取り除きたい位置の直前にあるオブジェクトを参照できれば簡単に行える。 ---- === つながっているものすべてを表示するメソッド === これは以前に作成したものです。 {{{#!java void showAll() { Chain c; c = this; System.out.println("("); while (c != null) { c.show(); c = c.next; } System.out.println(")"); } }}} これをもとにして、次の2つのメソッドを作成します。 ---- === つながっている個数を返すメソッド === つながっている個数を返すメソッドlengthを作ります。 返す値はintです。次の修正が必要。 * メソッドの型宣言 * return 処理内容 showAllではオブジェクト1つずつに対してshowを行っていたので、 ここでカウントを行えばよい。 変数の宣言と初期化を加え、不要な部分を除けば完成。 {{{#!java int length() { Chain c = this; int cnt = 0; while (c != null) { cnt++; c = c.next; } return cnt; } }}} ---- === 指定された位置にあるオブジェクトを返すメソッド === つながっている個数を返すメソッドnthを作ります。 * 引数として位置を表す数値(int)を取ります。 * 返す値はChainです。 次の修正が必要。 * メソッドの型宣言 * return 処理内容 カウントを行い指定の箇所まできたら、そのとき指しているオブジェクトを返せばよい。 条件はwhileの条件に追加。 {{{#!java Chain nth(int n) { Chain c = this; int cnt = 0; while (c != null && cnt < n) { cnt++; c = c.next; } return c; } }}} . {{attachment:chain41.png}} ---- === メソッド内でメソッドを使う === メソッド内でメソッドを呼び出すこともできます。 このメソッドは次回使うので追加しておくこと。 {{{#!java void showContent() { next.showAll(); } }}} ---- === 線形リストを修正する === 上で作成したメソッドを使うと、リストの修正が簡単にできます。 例 aが参照しているリストの3番目のオブジェクトを削除する。 {{{ Chain a, temp; ... temp = a.nth(2); temp.next = temp.next.next; }}}