Upload
jotaro-shigeyama
View
117
Download
2
Embed Size (px)
Citation preview
javaによる線形リスト実装Jotaro Shigeyama
Smirnoff-UT 第一回勉強会
引用:http://ryuunen-no-ikuth.hatenablog.com/entry/2014/05/10/211037
• Jotaro Shigeyama
• 東京大学 機械情報工学科
• 徳山高専 機械電気工学科卒
• 4/8 三文会に出ます
自己紹介
Zugspize, München
2962m
• Javaをほんの少しかじった人
• データ構造に触れたことがあんまりない人
• のために作ってみました。
• 嘘書いてある可能性大 (そもそもJavaとか殆どやったことありません)
目的
• データ構造の一種。
• その名の通り、データが一本の鎖状につながった構造をしている。
• このリストに対して、データの 挿入・削除・検索などの操作が行える。
線形リスト構造とは
data next data next
• dataに格納したいデータ。
• nextに次のデータへのリンク。
…
今日はjavaで実装してみよう
• Cell = 線形リスト構造をなす要素
• dataをObject型、nextをCell型で 定義する。
Cellの定義
data next
“Cell”
• Cell = 線形リスト構造をなす要素
• dataをObject型、nextをCell型で 定義する。
Cellの定義
data next
“Cell”
public class Cell{ Cell next; Object data; Cell(Object data){ next = null; this.data = data; } }
“Cell.java”
• 先頭のCellはダミーにしておく。
• リストのコンストラクタで設定。
Listの構築 ~ヘッダーセル~
data next data next
“Header”
• 先頭のCellはダミーにしておく。
• リストのコンストラクタで設定。
Listの構築 ~ヘッダーセル~
data next data next
“Header”public class LinkedList{ final Cell header; public LinkedList(){ header = new Cell("List Head"); } }
“LinkedList.java”
• セルの位置p,qの間に挿入する。
• pのdata<=挿入したいdata or p==nullのときに挿入を実行。
Listの構築 ~挿入1~
data next data next
“LinkedList.java”
public class LinkedList{ final Cell header;
//insert public void insert(int num){ Cell p = header.next; Cell q = header; while(p != null && num > (Integer)p.data){ q = p; p = p.next; } Cell newCell = new Cell(num); newCell.next = p; q.next = newCell; } }
data next
“p”“q”
“newCell”
注:dataを昇順で挿入するプログラムです。
• qのnextをnewCellに接続
• newCellのnextをpに接続
Listの構築 ~挿入2~
data next data next
“LinkedList.java”
public class LinkedList{ final Cell header;
//insert public void insert(int num){ Cell p = header.next; Cell q = header; while(p != null && num > (Integer)p.data){ q = p; p = p.next; } Cell newCell = new Cell(num); newCell.next = p; q.next = newCell; } }
data next
“p”“q”
“newCell”
• 真ん中のCellを削除したい。
• とりあえず…
• 「→の操作だけでListからハブる」
Listの構築 ~削除1~
data next data next data next
• こういうこと
• Headerからたどった時に、真ん中のCellに引っかからない。
• 一応消えたことになってる??
Listの構築 ~削除2~
data nextdata next
data next
public class LinkedList{ //Delete a cell which has data equal to 'num'. public void delete(int num){ Cell p = header.next; Cell q = header; while(num != (Integer)p.data){ q = p; p = p.next; } q.next = p.next; } }
“p”“q”
“LinkedList.java”
• リンクの内容を表示できるようにしたい
• リンクの状況をString型で返せると便利。
toStringの実装
2 next 3 next
“LinkedList.java”
public class LinkedList{ public String toString(){ StringBuilder st = new StringBuilder(); st.append("[ "); for(Cell p = header.next; p!=null; p=p.next){ st.append(p.data + " "); } st.append("]"); return st.toString(); } }
link.toString = “[2 3]”
実行してみる。
“LinkedList.java”
public class Main { public static void main(String[] args) { LinkedList list = new LinkedList(); list.insert(2); list.insert(5); list.insert(4); System.out.println(list.toString()); list.delete(4); System.out.println(list.toString());
LinkedList list2 = new LinkedList(); list2.insert(2); list2.insert(5); list2.insert(4); list2.delete(2); System.out.println(list2.toString()); } }
課題:オブジェクトの消去・例外処理
✓結局DeleteできてないCellは?
✓Deleteするときに、対象のデータがないとき
✓Deleteするときに、リンクにデータがないとき
✓dataの型は混合可能だろうか
応用:Stack, Queue
✓Stack :先に入ったデータは後に出てくる
✓Queue:先に入ったデータは先に出てくる
✓探索に応用が効いたりするらしい また今度m(_ _)m
javaによる線形リスト実装Jotaro Shigeyama
Smirnoff-UT 第一回勉強会
おわり制作・著作Jotaro