diff --git a/memo.md b/memo.md index 4bd0397..011ad87 100644 --- a/memo.md +++ b/memo.md @@ -1 +1,125 @@ # Step1 + +## アプローチ + +* 数字を順番に見ていってリストに内容を保存. リストの後ろを見ながら新しいノードを作成していく +* 前から順番に繋ぎ変えていく. + * in-placeでも, 別のノードリストを用意してもできる. +* 再帰で実装もできるけど本質的にはやること一緒. + +## Code1-1 (別のリストに数字を保存) + +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + values = [] + while head is not None: + values.append(head.val) + head = head.next + reversed_head_dummy = ListNode() + reversed_tail = reversed_head_dummy + for i in range(len(values) - 1, -1, -1): + node = ListNode(values[i]) + reversed_tail.next = node + reversed_tail = reversed_tail.next + return reversed_head_dummy.next +``` + +## Code1-2 (別のメモリ使用. one path) + +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + reversed_head = None + node = head + while node is not None: + new_node = ListNode(node.val) + new_node.next = reversed_head + reversed_head = new_node + node = node.next + return reversed_head +``` + +## Code1-3 (in-place, one path) + +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + reversed_head = None + node = head + while node is not None: + next_node = node.next + node.next = reversed_head + reversed_head = node + node = next_node + return reversed_head +``` + +# Step2 + +変更なし + +# Step3 + +## Code1-1 (別のリストに数字を保存) + +* `values[::-1]`とするよりも, `range(len(values) - 1, -1, -1)`を使った方が, 配列が新たにコピーされなくて済むので効率的かと思ったが, 結局`range()`も新しく配列を新たに作成する上, 中に含まれるのはどちらも`int`型だから変わらない気がしてきた. + +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + values = [] + node = head + while node is not None: + values.append(node.val) + node = node.next + reversed_dummy_head = ListNode() + reversed_tail = reversed_dummy_head + for i in range(len(values) - 1, -1, -1): + new_node = ListNode(values[i]) + reversed_tail.next = new_node + reversed_tail = reversed_tail.next + return reversed_dummy_head.next +``` + +## Code1-2 (別のメモリ使用. one path) + +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + node = head + reversed_head = None + while node is not None: + new_node = ListNode(node.val) + new_node.next = reversed_head + reversed_head = new_node + node = node.next + return reversed_head +``` + +## Code1-3 (in-place, one path) + +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + prev = None + node = head + while node is not None: + next_node = node.next + node.next = prev + prev = node + node = next_node + return prev +```