diff --git a/206. Reverse Linked List/206. Reverse Linked List.md b/206. Reverse Linked List/206. Reverse Linked List.md new file mode 100644 index 0000000..5c496e8 --- /dev/null +++ b/206. Reverse Linked List/206. Reverse Linked List.md @@ -0,0 +1,99 @@ +# 206. Reverse Linked List +## STEP1 +- 何も見ずに解いてみる +```python +# Definition for singly-linked list. +# class ListNode: +# def __init__(self, val=0, next=None): +# self.val = val +# self.next = next +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + if head is None: + return None + node = head + prev_node = None + while True: + next_node = node.next + node.next = prev_node + prev_node = node + if next_node is None: + return node + node = next_node +``` + +#### memo +- まずはheadがNoneの場合を処理し、着目しているnodeと逆順に変換済みのprev_node、つなぎ換えの際にnode.nextを上書きするのでnext_nodeを変数として取っておくという方針とした。 +- while文の条件とreturnする箇所がわかりやすいかは自信がない。 + +時間計算量 +- O(N) +空間計算量 +- O(1) + +## STEP2 +### プルリクやドキュメントを参照 +- https://docs.google.com/document/d/11HV35ADPo9QxJOpJQ24FcZvtvioli770WWdZZDaLOfg/edit?tab=t.0#heading=h.x5w37bodndgj + - 再帰でも書ける。書いてみる。パターン1 + ```python + class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + head, _ = self._reverse_list_helper(head) + return head + + def _reverse_list_helper(self, node: Optional[ListNode]) -> tuple[Optional[ListNode], Optional[ListNode]]: + if node is None: + return None, None + if node.next is None: + return node, node + head, tail = self._reverse_list_helper(node.next) + tail.next = node + node.next = None + return head, node + ``` + - 再帰パターン2 + ```python + class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + return self._reverse_list_helper(None, head) + + def _reverse_list_helper(self, reversed_list: Optional[ListNode], node: Optional[ListNode]) -> Optional[ListNode]: + if node is None: + return reversed_list + node_to_be_checked = node.next + node.next = reversed_list + reversed_list = node + return self._reverse_list_helper(reversed_list, node_to_be_checked) + ``` + - prevという変数名については操作の順番から来ている。変数名を、意味からつけるか操作からつけるかわかりやすい方を採用する。 +- STEP1をわかりやすく書き直す。STEP1では操作から変数名をつけたためprevという変数があった。これをsorted_headに変更した。 + ```python + class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + checking_node = head + sorted_head = None + while checking_node is not None: + next_node = checking_node.next + checking_node.next = sorted_head + sorted_head = checking_node + checking_node = next_node + return sorted_head + ``` +- https://github.com/TORUS0818/leetcode/pull/9/files#r1598051541 + - 考慮できていない観点であった。4行程度の処理なので問題ないと判断した。 + +## STEP3 +### 3回ミスなく書く +```python +class Solution: + def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: + checking_node = head + sorted_head = None + while checking_node is not None: + next_node = checking_node.next + checking_node.next = sorted_head + sorted_head = checking_node + checking_node = next_node + return sorted_head +``` +2分,2分,2分で3回Accept