206.reverse linked list#7
Conversation
| public: | ||
| ListNode* reverseList(ListNode* head) { | ||
| stack<int> valstack; | ||
| ListNode* dummy = new ListNode(2147483647,head); |
There was a problem hiding this comment.
コメントありがとうございます。
int型のmax valueを番兵に用いています。
There was a problem hiding this comment.
dummyノードの値は一度も使用していないので、番兵(コードを簡略化するための値)としての役割はなさそうです。
There was a problem hiding this comment.
ご返信ありがとうございます。
その通りです。この場合headを保存しておけばよいだけですね。
There was a problem hiding this comment.
わざわざ2147483647と書いて、(環境依存になる)intの最大値を選んだ理由はありますか?仮にINT_MAXが必要だったとしても、リテラルで書くのは好ましくないように思います。
| } | ||
| }; | ||
| ``` | ||
| 再帰では始めに一番最後のノードが返されるところから最初のノードにまで遡っていくが、この方法ではprevious=nullとするイニシャルコストを払うことで最初から最後まで直線的に処理が行える。 |
There was a problem hiding this comment.
この方法ではprevious=nullとするイニシャルコストを払う
ここで「イニシャルコスト」はどういう意味で使っていますか?
There was a problem hiding this comment.
ループの中にnullptrを繋げる処理を書かずにループの外側で最初のノードにのみnullptrを繋げる処理を行うという意味で使っています。
ループ内をキレイにするために外側で少しキレイじゃないことをするというようなニュアンスでこの表現になりました。
There was a problem hiding this comment.
ループの中にnullptrを繋げる処理を書かずにループの外側で最初のノードにのみnullptrを繋げる処理を行う
これはコードと振る舞いが違いませんか?単にpreviousをnullptrで初期化しているように見えます。
There was a problem hiding this comment.
再帰で書いたときに毎回nullptrを代入していたことと比較しての説明です。
ループのスタート地点にnullptrとheadを前後の位置関係で与えているだけなのでループの外というのは違うかもしれません。
There was a problem hiding this comment.
意図は理解しましたが、単にpreviousをnullptrで初期化することを「キレイじゃない」と言うことに違和感があります。イニシャルコストという表現も、重い処理が最初に走るようなイメージがあります。
| public: | ||
| ListNode* reverseList(ListNode* head) { | ||
| stack<int> valstack; | ||
| ListNode* dummy = new ListNode(2147483647,head); |
There was a problem hiding this comment.
先頭のポインタを保存しておくために使ったのですが、別に番兵でなくてもよいですね。
気づいていませんでした。ありがとうございます。
| } | ||
| ListNode *temp = dummy->next; | ||
| while (!valstack.empty()) { | ||
| temp->val = valstack.top(); |
There was a problem hiding this comment.
ListNodeの値を書き換えるのは、明示的に言及されていないものの、問題の意図から外れるかもしれません。
There was a problem hiding this comment.
new演算子に使いなれておらず、無意識にこのような選択をしました。
逆転した新しいノードという題意からしても破壊的なコードは避けるべきですね。ありがとうございます。
There was a problem hiding this comment.
明示的に書かれていないのですが、ListNodeのnextのみを書き換えるのが、この問題の意図かと思います。
Given the head of a singly linked list, reverse the list, and return the reversed list.
問題に「新しいノード」とは書いていませんね。
There was a problem hiding this comment.
なるほど、本筋は再帰やループによるnext書き換えであってvalの書き換えと新たなリストの作成は意図からずれるということですね。
読み取れていませんでした。ありがとうございます。
| public: | ||
| ListNode* reverseList(ListNode* head) { | ||
| stack<int> valstack; | ||
| ListNode* dummy = new ListNode(2147483647,head); |
| valstack.pop(); | ||
| temp = temp->next; | ||
| } | ||
| return dummy->next; |
| } | ||
| ListNode *temp = dummy->next; | ||
| while (!valstack.empty()) { | ||
| temp->val = valstack.top(); |
There was a problem hiding this comment.
明示的に書かれていないのですが、ListNodeのnextのみを書き換えるのが、この問題の意図かと思います。
Given the head of a singly linked list, reverse the list, and return the reversed list.
問題に「新しいノード」とは書いていませんね。
| } | ||
| }; | ||
| ``` | ||
| 再帰では始めに一番最後のノードが返されるところから最初のノードにまで遡っていくが、この方法ではprevious=nullとするイニシャルコストを払うことで最初から最後まで直線的に処理が行える。 |
There was a problem hiding this comment.
ループの中にnullptrを繋げる処理を書かずにループの外側で最初のノードにのみnullptrを繋げる処理を行う
これはコードと振る舞いが違いませんか?単にpreviousをnullptrで初期化しているように見えます。
This problem: https://leetcode.com/problems/reverse-linked-list/
Next problem: https://leetcode.com/problems/kth-largest-element-in-a-stream/description/