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

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

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

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

Q&A

解決済

2回答

1683閲覧

リストの全ての要素を末尾から出力したいです

VkeX6coYU

総合スコア1

Java

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

0グッド

0クリップ

投稿2020/06/26 07:29

編集2020/06/26 08:33

前提・実現したいこと

リストの全ての要素を末尾から出力したい

そのまま出力することはできたのですが、逆順の出力がわかりません。
Collectionやforを使ったのですがうまくいきませんでした。
今現在太字で書いているところなのですが
このプログラムの改善点を教えていただきたいです。
以下のようにしたいですが
/* printAll /
A
<->
B
<->
C
<->
D
/
printAllReverse */
D
<->
C
<->
B
<->
A

このようになってしまいます。
/* printAll */
A
<->
B
<->
C
<->
D

/* printAllReverse */
null
Exception in thread "main" java.lang.NullPointerException
at DoublyLinkedList.printAllReverse(DoublyLinkedList.java:98)
at Lesson15_1.main(Lesson15_1.java:13)

該当のソースコード

public class Main {
public static void main(String[] args) {
DoublyLinkedList list = new DoublyLinkedList();
list.insert(1, "A");
list.insert(2, "B");
list.insert(3, "C");
list.insert(4, "D");

System.out.println("/* printAll */"); list.printAll(); System.out.println(); **System.out.println("/* printAllReverse */"); list.printAllReverse();** }

}

public class DoublyLinkedList {
private DoublyElement firstElement;
//リストの先頭
private DoublyElement lastElement;
//リストの最後
public DoublyLinkedList() {
//コンストラクタ
this.firstElement = new DoublyElement(null);
this.lastElement = new DoublyElement(null);
this.firstElement.setNextElement(this.lastElement);
this.lastElement.setPreviousElement(this.firstElement);
}
public Object get(int index) {
//index番目のデータを取り出す
DoublyElement element = this.getElement(index);
// 指定された場所にDoublyElementオブジェクトがあるか調べる
if (null == element) {
// 指定された場所にDoublyElementオブジェクトがないので
// エラーメッセージを出力して処理を抜ける
System.out.println("Not exist: " + index);
return null;
}
return element.getData();
}

public boolean insert(int index, Object obj) { //index番目にobjを格納した要素を挿入 //指定された場所が正しいかどうか if (index < 1) {System.out.println("Cannot insert: " + index); return false; } DoublyElement previous = this.getElement(index-1); if (previous == null) { System.out.println("Cannot insert: " + index); return false; } DoublyElement element = new DoublyElement(obj); element.setNextElement(previous.getNextElement()); previous.getNextElement().setPreviousElement(element); previous.setNextElement(element); element.setPreviousElement(previous); return true; } public boolean remove(int index) { //index番目の要素を削除 //指定された場所が正しいかどうか if (index < 1) { System.out.println("Cannot remove: " + index); return false; } DoublyElement removeElement = this.getElement(index); if (removeElement == null) { System.out.println("Cannot remove: " + index); return false; } DoublyElement previous = this.getElement(index -1); previous.setNextElement(removeElement.getNextElement()); removeElement.getNextElement().setPreviousElement(previous); removeElement.setNextElement(null); removeElement.setPreviousElement(null); return true; } private DoublyElement getElement(int index) { //index番目の要素を取得 DoublyElement currentElement = this.firstElement; // 指定された場所まで、先頭から順番に移動する for (int count = 0; count < index; count++) { // 次の要素へ移動 currentElement = currentElement.getNextElement(); // リストの最後まで到達 if (currentElement == this.lastElement) { return null; } } return currentElement; } public void printAll() { DoublyElement currentElement = this.firstElement.getNextElement(); while (currentElement != this.lastElement) { System.out.println(currentElement); currentElement = currentElement.getNextElement(); if (currentElement != this.lastElement) { System.out.println("<->"); } } System.out.println(); } **public void printAllReverse(){ DoublyElement currentElement = this.lastElement.getNextElement(); while (currentElement != this.firstElement) { System.out.println(currentElement); currentElement = currentElement.getNextElement(); if (currentElement != this.firstElement) { System.out.println("<->");** } } System.out.println(); }
Java

public class DoublyElement {
private Object data;
private DoublyElement next, previous;
private DoublyElement () {
}
public DoublyElement (Object obj) {
this.data = obj;
}
public Object getData() {
return this.data;
}
public DoublyElement getNextElement() {
return this.next;
}
public void setNextElement(DoublyElement nextElement) {
this.next = nextElement;
}
public DoublyElement getPreviousElement() {
return this.previous;
}
public void setPreviousElement(DoublyElement previousElement) {
this.previous = previousElement;
}public String toString() {
return this.data.toString();
}
}

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

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

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

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

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

LouiS0616

2020/06/26 07:41 編集

コードを見る側の手間も考えていただきたいです。 1. インデントが潰れていますが、これは読みやすいですか。コードを挿入する機能があることに気付いていますか。 2. どの行で例外が発生したのか、この質問からすぐに読み解けますか。 3. VkeX6coYUさん自身はこのエラーに心当たりはありますか。原因を追究すべくどんな調査をしましたか。
Daregada

2020/06/26 08:19 編集

読みにくいのでエディタで整形して眺めてみたけど、DoublyElementクラスがどこにもないのでは? 名前からして双方向連結リストなんだろうけど。
YT0014

2020/06/26 08:28

DoublyElementクラスのコードもご提示ください。 DoublyLinkedList の各プロパティの仕様を確認し、現在の実装がそれを満たしているか、ご確認ください。
VkeX6coYU

2020/06/26 08:33

ごめんなさい。追加しました、まだ解決しておりません
YT0014

2020/06/26 08:38

"java"と入力した部分に、ソースコードを貼り付けてください。
退会済みユーザー

退会済みユーザー

2020/06/26 08:49

```Java public class Main{ ~~省略~~ } ``` ```Java public class DoublyLinkedList { ~~省略~~ } ``` て感じで```の間にコードを挿入してください。
guest

回答2

0

ベストアンサー

方針としては、先頭に向けて遡るのだから、printAllReverseではgetNextElementではなくgetPreviousElementを使う。

投稿2020/06/26 14:50

編集2020/06/26 14:51
Daregada

総合スコア11990

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

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

0

lastElementには、nextElementが設定されていません。
また、insert()やremove()で、lastElemntのpreviousElementが更新されていません。

投稿2020/06/26 11:46

編集2020/06/26 11:51
YT0014

総合スコア1750

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問