質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

Q&A

解決済

2回答

1010閲覧

連結リストで先頭に指定要素追加したい

trainingnow

総合スコア22

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

0グッド

0クリップ

投稿2022/02/16 01:56

前提・実現したいこと

連結リストにおいて、先頭に指定要素追加していきたいのですが、先頭に追加する最後のメソッドになるとnullとして追加?されてしまいます。

リンクの付け替えにおいて何か問題があるのだろうと考えているのですが、解決方法が分かりません。
NewLinkedListのみを修正して正しく表示されるソースをご教授願いたいです。

発生している問題・エラーメッセージ

ListTestを実行すると「[ banana cherry durian null ]→[abcd]ならOK」となってしまう
本当ならappleをbananaの左(先頭)に追加したいが、nullが表示されてしまう。

該当のソースコード

Java

1public class ListTest { 2 public static void main(String[] args) { 3 NewLinkedList list = new NewLinkedList(); 4 list.deleteNode("orange"); //d0 5 list.appendToHead("durian"); //h0 d 6 list.deleteNode("orange"); //d1 7 list.appendToHead("cherry"); //h1 cd 8 list.deleteNode("orange"); //d2 9 list.appendToHead("banana"); //h2 bcd 10 list.deleteNode("orange"); //d3 11 list.appendToHead("apple"); //h3 abcd 12 list.deleteNode("orange"); //d4 13 System.out.println(list + "→[abcd]ならOK"); 14} 15}

Java

1public class MyLinkedList { 2 // リストの要素 3 protected class Node { 4 Node next = null; // 次のリストへのリンク 5 String data; // 格納するデータ 6 7 // コンストラクター 8 Node(String d) { 9 data = d; 10 } 11 } 12 13 //リストの先頭を示すポインタ 14 //アドレス 15 Node head = new Node(null); 16 17 // リストの末尾に要素を追加する 18 public void appendToTail(String d) { 19 Node n = head; 20 while (n.next != null) { // 末尾を探す 21 n = n.next; 22 } 23 n.next = new Node(d); // 末尾にノードを生成して追加 24 System.out.println(d + " を末尾に追加しました。"); 25 } 26 27 // リストの内容を出力する 28 public String toString() { 29 StringBuilder st = new StringBuilder(); 30 st.append("[ "); 31 for (Node p = head.next; p != null; p = p.next) { 32 st.append(p.data + " "); 33 } 34 st.append("]"); 35 return st.toString(); 36 } 37 38}

Java

1 //リストの先頭に指定要素を追加するメソッド 2 //追加後「~ を先頭に追加しました。」を出力する。 3 //ただし ~ は指定要素名で直後に半角空白を入れる(以下同様)。 4 public void appendToHead(String d) { 5 //ノードの生成 6 Node newHead = new Node(d); 7 8 //元の先頭要素へのリンクを新ノードリンクに付け替える 9 newHead.next = head; 10 11 //新ノードを元の先頭要素のリンクに付け加える 12 head = newHead; 13 14 System.out.println(d + " を先頭に追加しました。"); 15 } 16 17 //指定データを持つ要素を削除するメソッド 18 //指定データがあれば削除して「~ を削除しました。」を出力する。 19 //ただし指定データが複数ある時は、先頭のものを1 つだけ削除する。 20 //指定データが無ければ「~ は存在しません。」を出力する。 21 public void deleteNode(String d) { 22 //Node n = head;を定義 23 Node n = head; 24 //指定データを持つノードが存在するまで繰り返し 25 while(n.next != null) { 26 //次要素が指定データを持っていた場合 27 if (n.next.data == d) { 28 //1つ先の要素へのリンクに付け替え 29 n.next = n.next.next; 30 System.out.println(d + " を削除しました。"); 31 return; 32 } 33 n = n.next; 34 } 35 System.out.println(d + " は存在しません。"); 36 return; 37 } 38 39} 40

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決できました。
リンクの付け替えの部分が間違っていたみたいです。
ありがとうございました。

投稿2022/02/16 05:16

trainingnow

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

toStringですが、

java

1for (Node p = head.next; p != null; p = p.next) { 2 st.append(p.data + " "); 3 }

これだとhead.nextから始まっているので、headそのものが抜けているのではないでしょうか。

投稿2022/02/16 03:57

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

trainingnow

2022/02/16 05:01

回答ありがとうございます。 NewLinkedListクラスのみの修正でこの問題を解決しないといけないのです。 またheadに修正してもnullが表示されてしまうので、まだ解決できない状態になってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問