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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

2回答

1723閲覧

Linkedlistの仕組み (コンストラクタの再帰呼び出し)がわからない

vicreo32

総合スコア15

Java

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

コンストラクタ

オブジェクト指向言語において、オブジェクトを生成時に呼び出され、データの初期化などを行なう関数・メソッドのことである。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2020/05/22 13:31

前提・実現したいこと

HackerRankでの問題です。

このコードは
4
2
3
4
1
と入力すると
2 3 4 1
と返してくれるコードで、

Solutionクラスのinsertメソッドの下から2,3行目の
temp.next=node;
return head;
というところで、headがnullではなかった場合にheadの中身は変わらないはずなのに、どうやってheadの中身を更新しているのか分からないため教えていただきたいです。

(質問の内容をうまく表すタイトルが思いつけず、少し違う内容なのはすみません)

該当のソースコード

Java

1import java.io.*; 2import java.util.*; 3 4class Node { 5 int data; 6 Node next; 7 Node(int d) { 8 data = d; 9 next = null; 10 } 11} 12 13class Solution { 14 15 public static Node insert(Node head,int data) { 16 Node node=new Node(data); 17 if(head==null) 18 { 19 head=node; 20 return head; 21 } 22 Node temp=head; 23 while(temp.next!=null) 24 { 25 temp=temp.next; 26 } 27 temp.next=node; 28 return head; 29 } 30 31 public static void display(Node head) { 32 Node start = head; 33 while(start != null) { 34 System.out.print(start.data + " "); 35 start = start.next; 36 } 37 } 38 39 public static void main(String args[]) { 40 Scanner sc = new Scanner(System.in); 41 Node head = null; 42 int N = sc.nextInt(); 43 44 while(N-- > 0) { 45 int ele = sc.nextInt(); 46 head = insert(head,ele); 47 } 48 display(head); 49 sc.close(); 50 } 51}

試したこと

temp.next=node;の前後でSystem.out.println(head.next.data);を試したところ後に書いた方はうまくいき、前に書いたときはNullPointerExceptionになったため、headを更新しているのはこのコードだろうと予測した次第です。

補足情報(FW/ツールのバージョンなど)

HackerRankのエディター内での実行
java8

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

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

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

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

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

guest

回答2

0

temp = headをした上で、temp = temp.nextを数回繰り返した後にtemp.next = nodeとしております。このため、head.next.next.next・・・.next = nodeという代入がされます。

投稿2020/05/22 14:25

HogeAnimalLover

総合スコア4830

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

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

0

ベストアンサー

headがnullではなかった場合にheadの中身は変わらないはずなのに

どうしてそう考えたのでしょうか。元のhead.nextnullであれば、temp=headのままwhileループは1回も実行せずにスルーしますので、temp.nextを書き換えればhead.nextも書き換わります。

投稿2020/05/22 14:04

編集2020/05/22 14:08
maisumakun

総合スコア145183

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

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

vicreo32

2020/05/22 14:26

temp.nextを書き換えればhead.nextも書き換わるというのが理解できていなくて、初歩的な質問ですみませんが、headの中身を変えるためにはhead=tempをする必要があるのではないですか?
maisumakun

2020/05/22 14:33

Javaのオブジェクトは参照です。「temp=head」とすれば、両者は同じオブジェクトを指す状態になります。
vicreo32

2020/05/22 14:35

自分でインスタンスを作って同じように試したところ、head = tempをしなくてもheadの中身が入れ替わることが確認できました。理由まではまだ理解できていませんが、自分で調べてみたいとおもいます。お手数おかけしましたが、助かりました。ありがとうございます!
vicreo32

2020/05/22 14:37

すみません、投稿がかぶってしまったみたいです。 なるほど、理解できました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問