Conversation
| return new_head | ||
| if not head: |
There was a problem hiding this comment.
inner function定義部分の区別がつきやすいよう、ここには改行を入れたいなと思いました。
| return new_head | |
| if not head: | |
| return new_head | |
| if not head: |
| if not head: | ||
| return head | ||
|
|
||
| head, _tail = reverseListHelper(head) |
There was a problem hiding this comment.
未使用変数は1つだけであり、他の未使用変数と区別する必要が無いことから単に_にすると思いました。
| head, _tail = reverseListHelper(head) | |
| head, _ = reverseListHelper(head) |
| class Solution: | ||
| def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: | ||
| node = head | ||
| stack = [] |
There was a problem hiding this comment.
各 node を繋げたまま stack に格納していくのに違和感があったため、自分なら以下のように、一度繋がりを切ってから stack に格納する書き方をすると思いました。
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
node = head
stack = []
while node is not None:
next_node = node.next
node.next = None
stack.append(node)
node = next_node
dummy = ListNode()
tail = dummy
while stack:
tail.next = stack.pop()
tail = tail.next
return dummy.nextThere was a problem hiding this comment.
なるほど
このような書き方もあるのですね!参考になります。
| 以下のように記述したが間違い. head.next以降を逆順に並び替えたものの後ろに加えるという発想はあっていたが, これだと末尾を返すことになってしまう. | ||
| ```py | ||
| class Solution: | ||
| def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: |
There was a problem hiding this comment.
「末尾を返している」というよりは、頭を返してはいるものの、head を取り付ける位置が違っている、という表現の方がが正確なのかなと感じます。以下で書くと、正常に動くと思います。
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head is None or head.next is None:
return head
reversed_head = self.reverseList(head.next)
## head.next から逆順にすると、処理後に head.next は tail になるので、head.next の次を head にしてあげれば良い。
head.next.next = head
head.next = None
return reversed_head| class Solution: | ||
| def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: | ||
| def reverseListHelper(node): | ||
| # nodeが最後の要素のとき. |
There was a problem hiding this comment.
こちらが考え方 2の実装で、末尾再帰で書いている方が考え方 1 実装かなと思います。こちらでは、「自分が持っている部分は渡さず、自分が持っている部分から先(n番目以降)を逆順にしたものを返却してもらって」、返却してもらったものをもとに自分で処理を行なっているためです。
| def reverseListHelper(reversed_head, rest_node): | ||
| if rest_node.next is None: | ||
| rest_node.next = reversed_head | ||
| return rest_node |
There was a problem hiding this comment.
reversed_head が「すでに逆順にしたノードの先頭」、rest_node が「まだ逆順にしていないノードの先頭」であることを踏まえると、rest_node.next をもとに終了を判定するのではなく、rest_node がなくなればその時点で逆順にする処理は終わっているため、そのまま reversed_head を返す方がわかりやすいのかなと思います。
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
def reverseListHelper(reversed_head, rest_node):
if rest_node is None:
return reversed_head
rest_node_next = rest_node.next
rest_node.next = reversed_head
return reverseListHelper(rest_node, rest_node_next)
if not head:
return head
return reverseListHelper(None, head)
解く問題
Reverse Linked List
次に解く問題
Kth Largest Element In A Stream