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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

1583閲覧

片方向リストを逆順にするreverse関数を、再帰を使って書くことは可能ですか?

moyong

総合スコア19

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/04/19 17:30

JavaScript勉強中の者です。
[2,10,34,45,67,356]という片方向の連結リストを受け取って「356,67,45,34,10,2」と出力するreverse関数を次のように書きました。これはこれでうまくいくのですが再帰だともっと行数が減らせるかなと思っています。

JavaScript

1function findMergeNode(headA,headB){ 2 console.log(reverse(headA)); 3} 4function reverse(head) { 5 let reverse = head; 6 head = head.next; 7 reverse.next = null; 8 while(head !== null) { 9 let temp = head; 10 head = head.next; 11 temp.next = reverse; 12 reverse = temp; 13 } 14 head = reverse; 15 return head; 16}

私なりに再帰で書く方法を考えてみましたが

JavaScript

1function findMergeNode(headA,headB){ 2 console.log(reverse(headA,null, null)); 3} 4function reverse(head, next, start) { 5 if(head === null) return start; 6 let temp = head; 7 temp.next = next; 8 return reverse(head.next, temp, temp); 9}

こう書くと{ data: 2, next: null }と帰ってきてしまいます(逆順にできていない)。
伝えるべき情報が抜け落ちていたら申し訳ありません。

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

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

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

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

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

miyabi_takatsuk

2021/04/19 18:34

回答した後になんですが、 JavaScriptには、もともと連結リストなるデータ型はないので、 話は通じません。 なので、その連結リストを生成しているライブラリ?のソースコードも提示してください。 もしくは、「連結リスト」の仕様を列挙してください。
ockeghem

2021/04/20 02:26

テストに用いたデータを実行可能な形で示してください。
guest

回答2

0

ベストアンサー

未検証ですが…

JavaScript

1function reverse(rev,head){ 2 if(head==null) 3 return rev; 4 next=head.next; 5 head.next=rev; 6 return reverse(head,next); 7}

投稿2021/04/19 19:17

編集2021/04/19 19:26
modieu

総合スコア282

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

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

0

連結リストに関して

通常のJavaScriptには連結リストなるデータ型はありません。
なので、後ろから前に戻っていく、
例えば、backというプロパティを使えるようなデータ型になるよう、
自身でそのライブラリなりなんなりを、変えた方がいいかと思います。

----- 下記は、通常配列においての話 -----

JavaScriptは配列の時点で要素の順列を逆にするメソッドがあります。

Array.prototype.reverse() - JavaScript | MDN

よって、自身で関数を用意する必要はありません。

javascript

1const arr = [2,10,34,45,67,356]; 2arr.reverse(); // [356,67,45,34,10,2]

投稿2021/04/19 18:28

編集2021/04/19 18:38
miyabi_takatsuk

総合スコア9555

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問