From 36605bd00ccc8bd351871ae60c6f5f891393aa90 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 6 Sep 2025 11:45:39 +0900 Subject: [PATCH 01/12] Add reverseList method to Solution class --- Reverse Linked List/step1.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 Reverse Linked List/step1.py diff --git a/Reverse Linked List/step1.py b/Reverse Linked List/step1.py new file mode 100644 index 0000000..1384c07 --- /dev/null +++ b/Reverse Linked List/step1.py @@ -0,0 +1,17 @@ +# 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]: + prev = None + node = head + + while node: + tmp = node.next + node.next = prev + prev = node + node = tmp + return prev + From 96625c4695201bcf374436fc08d3854d28383d1b Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 6 Sep 2025 12:27:49 +0900 Subject: [PATCH 02/12] Create step2-using-recursive.py --- Reverse Linked List/step2-using-recursive.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Reverse Linked List/step2-using-recursive.py diff --git a/Reverse Linked List/step2-using-recursive.py b/Reverse Linked List/step2-using-recursive.py new file mode 100644 index 0000000..4983151 --- /dev/null +++ b/Reverse Linked List/step2-using-recursive.py @@ -0,0 +1,19 @@ +# 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 not head: + return None + + new_head = head + + if head.next: + new_head = self.reverseList(head.next) + head.next.next = head + head.next = None + + return new_head + From dcb76d694a2b9bccc493cdfe1308832bcf791c7a Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 6 Sep 2025 12:34:18 +0900 Subject: [PATCH 03/12] Add stack-based solution for reversing linked list --- Reverse Linked List/step2-using-stack.py | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Reverse Linked List/step2-using-stack.py diff --git a/Reverse Linked List/step2-using-stack.py b/Reverse Linked List/step2-using-stack.py new file mode 100644 index 0000000..f8a6461 --- /dev/null +++ b/Reverse Linked List/step2-using-stack.py @@ -0,0 +1,27 @@ +# 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 not head: + return None + + stack = [] + node = head + while node: + stack.append(node) + node = node.next + + new_head = stack.pop() + tail = new_head + + while stack: + new_tail = stack.pop() + tail.next = new_tail + tail = tail.next + + tail.next = None + return new_head + From 13dcc6d2e77b98d85436689cb72b0409d7f1ee64 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 6 Sep 2025 12:36:12 +0900 Subject: [PATCH 04/12] Create step2-using-iterative.py --- Reverse Linked List/step2-using-iterative.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Reverse Linked List/step2-using-iterative.py diff --git a/Reverse Linked List/step2-using-iterative.py b/Reverse Linked List/step2-using-iterative.py new file mode 100644 index 0000000..5dcd234 --- /dev/null +++ b/Reverse Linked List/step2-using-iterative.py @@ -0,0 +1,16 @@ +# 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]: + previous_node, current_node = None, head + + while current_node: + tmp = current_node.next + current_node.next = previous_node + previous_node = current_node + current_node = tmp + return previous_node + From b282584d57f630300fe9728121b02da1d9e96b33 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 13 Sep 2025 12:51:42 +0900 Subject: [PATCH 05/12] Create step3-using-iteration.py --- Reverse Linked List/step3-using-iteration.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 Reverse Linked List/step3-using-iteration.py diff --git a/Reverse Linked List/step3-using-iteration.py b/Reverse Linked List/step3-using-iteration.py new file mode 100644 index 0000000..861af73 --- /dev/null +++ b/Reverse Linked List/step3-using-iteration.py @@ -0,0 +1,15 @@ +# 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]: + previous_node, current_node = None, head + + while current_node: + tmp = current_node.next + current_node.next = previous_node + previous_node = current_node + current_node = tmp + return previous_node From a94aeee5c3f418f5a2289cdb179501bee0214a8e Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 13 Sep 2025 13:06:14 +0900 Subject: [PATCH 06/12] Add recursive function to reverse linked list --- Reverse Linked List/step3-using-recursion.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Reverse Linked List/step3-using-recursion.py diff --git a/Reverse Linked List/step3-using-recursion.py b/Reverse Linked List/step3-using-recursion.py new file mode 100644 index 0000000..c2add94 --- /dev/null +++ b/Reverse Linked List/step3-using-recursion.py @@ -0,0 +1,16 @@ +# 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 or head.next is None: + return head + + new_head = self.reverseList(head.next) + head.next.next = head + head.next = None + + return new_head + From d453a1154f26226704f0e9af4346d045d80d7135 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 13 Sep 2025 13:15:50 +0900 Subject: [PATCH 07/12] Add reverseList method using stack approach --- Reverse Linked List/step3-using-stack.py | 27 ++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Reverse Linked List/step3-using-stack.py diff --git a/Reverse Linked List/step3-using-stack.py b/Reverse Linked List/step3-using-stack.py new file mode 100644 index 0000000..94666e7 --- /dev/null +++ b/Reverse Linked List/step3-using-stack.py @@ -0,0 +1,27 @@ +# 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 or head.next is None: + return head + + stack = [] + node = head + + while node: + stack.append(node) + node = node.next + + tail = stack.pop() + node = tail + + while stack: + node.next = stack.pop() + node = node.next + node.next = None + + return tail + From 16f6011b4b3b75dc8a2cd7b2fa0b10b27ad8b875 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Sat, 13 Sep 2025 13:29:31 +0900 Subject: [PATCH 08/12] Create memo.md --- Reverse Linked List/memo.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 Reverse Linked List/memo.md diff --git a/Reverse Linked List/memo.md b/Reverse Linked List/memo.md new file mode 100644 index 0000000..c8f10ad --- /dev/null +++ b/Reverse Linked List/memo.md @@ -0,0 +1,31 @@ +# step1 + +ループ処理の最中でノードを反転させていく方法が一番最初に思いついた。(というか、多分やったことがあって記憶にあった) +2分くらいで手順を書き出して、それをコード化することができた。 + +# step2 + +ループでのアプローチ以外に +- 再帰 +- スタック +があることを知った。 + +## 再帰について + +今回再帰でコード書いてみると通りはするけど、実際にノードの連結数に明記がないので不適。(LeetCodeの環境なら大丈夫なコードになってしまうから) + +時間計算量はO(N), 空間計算量はO(1) + +## スタック + +アプローチはとても自然で他人が書いたコードでも読みやすいと思った。 +ただ空間計算量がO(N)になり、他のアプローチを考えるとデメリット。 + +時間計算量はO(N), 空間計算量はO(N) + +## step3 + +AIもつかってリファクタリングをした。 +再帰はベースケースとエッジケースを最初に明記して後続の処理をよりシンプルに書くように変更 + + From c3652c5cea3bb8df39996c238907b14fcb16b74f Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:55:28 +0900 Subject: [PATCH 09/12] Create step4-using-stack.py --- Reverse Linked List/step4-using-stack.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 Reverse Linked List/step4-using-stack.py diff --git a/Reverse Linked List/step4-using-stack.py b/Reverse Linked List/step4-using-stack.py new file mode 100644 index 0000000..52ec19b --- /dev/null +++ b/Reverse Linked List/step4-using-stack.py @@ -0,0 +1,21 @@ +# 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 or head.next is None: + return head + stack = [] + node = head + while node: + stack.append(node) + node = node.next + new_head = stack.pop() + node = new_head + while stack: + node.next = stack.pop() + node = node.next + node.next = None + return new_head From c1bfe40427086ac8cc69e11ffc373f69bcae9397 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Thu, 16 Oct 2025 23:04:28 +0900 Subject: [PATCH 10/12] Create step4-using-iteration.py --- Reverse Linked List/step4-using-iteration.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 Reverse Linked List/step4-using-iteration.py diff --git a/Reverse Linked List/step4-using-iteration.py b/Reverse Linked List/step4-using-iteration.py new file mode 100644 index 0000000..2a8896f --- /dev/null +++ b/Reverse Linked List/step4-using-iteration.py @@ -0,0 +1,19 @@ +# 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 or head.next is None: + return head + + new_head_node, current_node = None, head + + while current_node: + rest_node_head = current_node.next + current_node.next = new_head_node + new_head_node = current_node + current_node = rest_node_head + return new_head_node + From eeace6057b31025a1c7f89c6545f27dc77bbc103 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Thu, 16 Oct 2025 23:11:18 +0900 Subject: [PATCH 11/12] Create step4-using-recursion.py --- Reverse Linked List/step4-using-recursion.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 Reverse Linked List/step4-using-recursion.py diff --git a/Reverse Linked List/step4-using-recursion.py b/Reverse Linked List/step4-using-recursion.py new file mode 100644 index 0000000..92afd78 --- /dev/null +++ b/Reverse Linked List/step4-using-recursion.py @@ -0,0 +1,16 @@ +# 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 or head.next is None: + return head + + new_head = self.reverseList(head.next) + new_previous_node = head.next + new_previous_node.next = head + head.next = None + return new_head + From c223cdf0ddedb58ed55f8d9ef0ea01c0f00c70b3 Mon Sep 17 00:00:00 2001 From: Takeshi Ooka <74577802+t-ooka@users.noreply.github.com> Date: Thu, 13 Nov 2025 22:31:04 +0900 Subject: [PATCH 12/12] Update memo.md --- Reverse Linked List/memo.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Reverse Linked List/memo.md b/Reverse Linked List/memo.md index c8f10ad..d03aaf7 100644 --- a/Reverse Linked List/memo.md +++ b/Reverse Linked List/memo.md @@ -14,7 +14,7 @@ 今回再帰でコード書いてみると通りはするけど、実際にノードの連結数に明記がないので不適。(LeetCodeの環境なら大丈夫なコードになってしまうから) -時間計算量はO(N), 空間計算量はO(1) +時間計算量はO(N), 空間計算量はO(N) ## スタック