19
javaによる線形リスト実装 Jotaro Shigeyama Smirnoff-UT 第一回勉強会 引用:http://ryuunen-no-ikuth.hatenablog.com/entry/2014/05/10/211037

Javaによる線形リスト実装

Embed Size (px)

Citation preview

Page 1: Javaによる線形リスト実装

javaによる線形リスト実装Jotaro Shigeyama

Smirnoff-UT 第一回勉強会

引用:http://ryuunen-no-ikuth.hatenablog.com/entry/2014/05/10/211037

Page 2: Javaによる線形リスト実装

• Jotaro Shigeyama

• 東京大学 機械情報工学科

• 徳山高専 機械電気工学科卒

• 4/8 三文会に出ます

自己紹介

Zugspize, München

2962m

Page 3: Javaによる線形リスト実装
Page 4: Javaによる線形リスト実装

• Javaをほんの少しかじった人

• データ構造に触れたことがあんまりない人

• のために作ってみました。

• 嘘書いてある可能性大 (そもそもJavaとか殆どやったことありません)

目的

Page 5: Javaによる線形リスト実装

• データ構造の一種。

• その名の通り、データが一本の鎖状につながった構造をしている。

• このリストに対して、データの 挿入・削除・検索などの操作が行える。

線形リスト構造とは

data next data next

• dataに格納したいデータ。

• nextに次のデータへのリンク。

Page 6: Javaによる線形リスト実装

今日はjavaで実装してみよう

Page 7: Javaによる線形リスト実装

• Cell = 線形リスト構造をなす要素

• dataをObject型、nextをCell型で 定義する。

Cellの定義

data next

“Cell”

Page 8: Javaによる線形リスト実装

• 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”

Page 9: Javaによる線形リスト実装

• 先頭のCellはダミーにしておく。

• リストのコンストラクタで設定。

Listの構築 ~ヘッダーセル~

data next data next

“Header”

Page 10: Javaによる線形リスト実装

• 先頭のCellはダミーにしておく。

• リストのコンストラクタで設定。

Listの構築 ~ヘッダーセル~

data next data next

“Header”public class LinkedList{ final Cell header; public LinkedList(){ header = new Cell("List Head"); } }

“LinkedList.java”

Page 11: 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を昇順で挿入するプログラムです。

Page 12: Javaによる線形リスト実装

• 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”

Page 13: Javaによる線形リスト実装

• 真ん中のCellを削除したい。

• とりあえず…

• 「→の操作だけでListからハブる」

Listの構築 ~削除1~

data next data next data next

Page 14: Javaによる線形リスト実装

• こういうこと

• 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”

Page 15: 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]”

Page 16: Javaによる線形リスト実装

実行してみる。

“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()); } }

Page 17: Javaによる線形リスト実装

課題:オブジェクトの消去・例外処理

✓結局DeleteできてないCellは?

✓Deleteするときに、対象のデータがないとき

✓Deleteするときに、リンクにデータがないとき

✓dataの型は混合可能だろうか

Page 18: Javaによる線形リスト実装

応用:Stack, Queue

✓Stack :先に入ったデータは後に出てくる

✓Queue:先に入ったデータは先に出てくる

✓探索に応用が効いたりするらしい また今度m(_ _)m

Page 19: Javaによる線形リスト実装

javaによる線形リスト実装Jotaro Shigeyama

Smirnoff-UT 第一回勉強会

おわり制作・著作Jotaro