双方向リストをjavaで書きたいんですけどここまで書いて双方向リストになってるか不安になってきました。
これは双方向リストになっていますか?
class MyListw{
int data;
MyListw next = null;//次のノードへのポインタ
MyListw prev = null;//前のノードへのポインタ
MyListw(int data){
this.data = data;
}
void insertTail(MyListw node){//リストの最後へ追加
MyListw tmp = this;
while(tmp.next != null){
tmp = tmp.next;
}
tmp.next = node;
node.prev = tmp.next;
}
void insertHead(MyListw node){//リストの先頭へ追加
node.next = this.next;
this.next = node;
node.prev = this.next;
}
void insert(int head, MyListw node){//リストの途中へ新規データを挿入
MyListw tmp = this;
while(tmp != null){
if(tmp.data == head){
break;
}
tmp = tmp.next;
}
node.next = tmp.next;
tmp.next = node;
node.prev = tmp.next;
}
void delete(int here, MyListw node){//リストからデータを1つ削除
MyListw tmp = this;
while(tmp != null){
if(tmp.data == here){
break;
}
tmp = tmp.next;
}
node = tmp.next;
tmp.next.prev = node;
tmp.next = node.next;
node.next.prev = tmp.next;
node.next = null;
node.prev = null;
}
void deleteHead(){//先頭のノードを削除
MyListw tmp = next;
this.next = tmp.next;
tmp.next.prev = this.next;
tmp.next = null;
tmp.prev = null;
}
void deleteTail(){//最後のノードを削除
MyListw tmp = this;
MyListw lastList = null;
while(tmp.next != null){
lastList = tmp;
tmp = tmp.next;
}
lastList.next = null;
lastList.prev = null;
}
void show(){
MyListw tmp = next;
while(true){
System.out.print(tmp.data);
if(tmp.next == null)
break;
tmp = tmp.next;
}
System.out.println("");
}
void showTail(){
}
}
class MyListwApp{
public static void main(String[] args){
MyListw list = new MyListw(0);//初期ダミー
System.out.println("最後に追加");
list.insertTail(new MyListw(1));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("\n");
list.insertTail(new MyListw(5));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("先頭に追加");
list.insertHead(new MyListw(8));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("\n");
list.insertHead(new MyListw(9));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("途中からデータを追加");
list.insert(1, new MyListw(2));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("\n");
list.insert(2, new MyListw(3));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("リストからデータを削除");
list.delete(8, new MyListw(1));
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("先頭のノードを削除");
list.deleteHead();//先頭のノードを削除
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("\n");
list.deleteHead();
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("最後のノードを削除");
list.deleteTail();//最後のノードを削除
list.show();
System.out.println("逆順に表示");
list.showTail();
System.out.println("\n");
list.deleteTail();
list.show();
System.out.println("逆順に表示");
list.showTail();
}
}
No.2ベストアンサー
- 回答日時:
双方向リストのメリットは、データの追加/削除操作を高速にできる
(リンク操作のためにループをする必要がない)点にあります。
このソースでは、せっかくのprevがあまり有効に活用されておらず、
片方向リストと処理性能が変わりません。
実質的に、双方向リストの処理になってないです。
まず、insertTail()やdeleteTail()の処理は、whileを使わないで
実現すべきです。
この処理をするには、リストの最終ノードを求める必要がありますが、
循環双方向リストの形にしておけば、リスト開始ノードのprevが
最終ノードということなります。
(循環双方向リストでなく、リストの先頭ノードと最終ノードを保持した、
リストオブジェクトを別に作る方法もあります。)
次に、insert(),delete()について、
このメソッドは、指定値と同じ値を持つノード位置に
新しいノードを挿入(またはそのノードを削除)という機能
なのだと思いますが、ノードの検索機能とノードの挿入/削除機能が
一緒になっているため、双方向リストのメリットを享受できません。
(1)指定値を持つノードを検索し、そのノードオブジェクトを返却するメソッド(find)
(2)ノードオブジェクトを指定し、そのノードの位置に新しいノードを
挿入する(またはそのノードを削除する)メソッド
の2つに分ければ、それぞれのメソッドの用途が広がり、
(2)のメソッドは双方向リストのメリットを活かした処理になります。
(参考)
http://akademeia.info/index.php?%C1%D0%CA%FD%B8% …
http://ja.wikipedia.org/wiki/%E9%80%A3%E7%B5%90% …
No.1
- 回答日時:
実行してみればわかるけど insert系は全滅です. 最後の文が間違っているだけだけど.
deleteHead もあやしいなぁ.
操作前と操作後の状況を図に描いて, 「それぞれのメンバの値がどうなればいいのか」を考えてみてください.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Ruby vscode 文字化け 1 2022/05/21 19:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語のポインターに関する警告
-
[JAVA]try 内の変数を外で!?
-
JSPやサーブレットでSystem.out...
-
nullcline
-
改行の判定方法
-
java int integer
-
java教えてください。
-
vb6 オブジェクトライブラリは...
-
エクセルマクロ文で、赤文字セ...
-
java シンボルが見つかりません...
-
Collectionからの型変換について
-
全角スペースの判定について
-
javaの文字化けに困っています。
-
ファイル名に変数を使う(Java)
-
「続行するには何かキーを押し...
-
(急募)Java 三択クイズをGUI(...
-
ソケット:書き出しをソケット...
-
JAVAのDouble型の小数点以下の...
-
ループ処理の際、最後だけ","を...
-
ダブルクォーテーションのrepla...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語のポインターに関する警告
-
JSPやサーブレットでSystem.out...
-
[JAVA]try 内の変数を外で!?
-
JAVAのDouble型の小数点以下の...
-
「続行するには何かキーを押し...
-
EclipseでJava
-
文字列の引き算
-
JAVAのエラーの意味が分かりま...
-
配列を後ろから数えるには?
-
JAVAで素数判定
-
nullcline
-
曜日の取得方法を教えて下さい!
-
エクセルマクロ文で、赤文字セ...
-
JAVA 文字色変更
-
会員情報登録プログラムの作成...
-
Javaのコマンドライン引数を使...
-
Javaでカレントディレクトリを...
-
LC発振回路-ループ利得
-
java シンボルが見つかりません...
-
改行の判定方法
おすすめ情報