Skip to content

Conversation

garunitule
Copy link
Owner

Copy link

@huyfififi huyfififi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

メモがわかりやすくて、思考のステップが追いやすかったです 👍

# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
reversed_list = None
Copy link

@huyfififi huyfififi Apr 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit この変数が保持するのは厳密には(?)なんらかのlistではなくnodeなので、reversed_headのような名付けの方が齟齬がないかと思いました。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ここ少し迷ったんですがその方がいいですね

迷った点としてはメソッド名がreverseListなので、変数も合わせた方が良いのかなと思いましたが、やっぱりListと混同しそうなのでreversed_headが良いと思いました

...
と作っていくので、与えられた連結リストを順番通りにたどりながら逆順にした連結リストを作れる。

再帰でもできそうだが、スタックオーバーフローしてしまうので避ける(ノード数が5000までだが、プラットフォームによるがデフォルトだと最大で1000なので)。
Copy link

@huyfififi huyfififi Apr 29, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

確かに、言語自体はデフォルトを定めていませんが、CPythonもPyPyもデフォルトの再帰のlimitは1000っぽいですね(実装によって再帰の深さの意味が若干違うようですが...🤔)。あんまり深く考えたことがなかったので勉強になります!

CPython
PyPy

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PyPyのほうは実装確認できてなかったです、ありがとうございます!

if head is None or head.next is None:
return head

node = head

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

再帰的に問題を分割していて、部分問題で見たらずっとheadに対して操作をしているので、nodeという別の名前を与えなくてもいいと思います。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

たしかにそうですね
同じ参照(head)に対して操作しているのでnodeという別の名前は不要だと思いました

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コメントを踏まえて実装しました
395d517

node.next = reversed_list
reversed_list = node
node = next_node
return reversed_list

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

繋ぎかえで書くなら、単にnodeと書くより、relinkingなどと命名した方が意図が伝わりやすいと思います。

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        relinking = head
        relinked = None
        while relinking is not None:
            next_relinking = relinking.next
            relinking.next = relinked
            relinked = relinking
            relinking = next_relinking

        return relinked

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるほど、relinkをベースとした命名もありですね
下記の役割だと思うので、relinkedはlast_relinkedが良いと思いましたがいかがでしょう?

  • 次に繋ぎ変えるノード: next_relinking
  • 繋ぎ変えているノード: relinking
  • 繋ぎ変えたノードの一番最後: last_relinked

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

コメントを踏まえて実装しました
dc739b0

```

## step3
3パターンで実装した。
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

違いは何を約束して次に回すかですね。

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ですね
・新しく作る方式: 現在までのノードで構成されていて、かつ逆順になった新しいListNodeを次に回す
・付け替え方式: 現在までのノードが逆順になった状態で次に回す
・再帰付け替え方式: 現在のノード以降が逆順になった状態で次に回す
だと理解してます

新しく作る方式だと1通りで、付け替えだと前後ろの2通りあります

@garunitule garunitule merged commit 6a5a6f4 into main May 11, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants