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

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

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

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

連結リスト

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

Q&A

解決済

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

trainingnow
trainingnow

総合スコア22

Java

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

連結リスト

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

2回答

0グッド

0クリップ

629閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/02/16 02:41

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

回答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が表示されてしまうので、まだ解決できない状態になってしまいます。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Java

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

連結リスト

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