From 3cf396eae3337a1ce751dcd55b09903f0de9fb0b Mon Sep 17 00:00:00 2001 From: Masakuni Date: Thu, 1 Jan 2026 12:11:19 +0900 Subject: [PATCH 1/4] step1 --- problems/206.reverse-linked-list/memo.md | 18 ++++++++++ problems/206.reverse-linked-list/step1.py | 40 +++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 problems/206.reverse-linked-list/memo.md create mode 100644 problems/206.reverse-linked-list/step1.py diff --git a/problems/206.reverse-linked-list/memo.md b/problems/206.reverse-linked-list/memo.md new file mode 100644 index 0000000..e4b88aa --- /dev/null +++ b/problems/206.reverse-linked-list/memo.md @@ -0,0 +1,18 @@ +## step1 +- headはnextをNoneに、それ以外はnextを一つ前の要素に変える +- stackとなっているが、一つ前以外の履歴は保持しなくていいのではないか? +- 最後に元々のnextがNoneの要素が見つかったらそれをheadにする + - よりもNoneを見たらdummy.nextに入れてそれをheadにした方がNoneが入ってきた時に場合分けがいらない +- 実装しようとするとめちゃ頭こんがらがるので一旦整理したい +- まず一番楽そうなstackでやってみる + - 全部stackに詰める + - 詰め終わったら末尾をheadにする + - popしてnextをstack[-1]にしていき、最後はnextをNoneにする + - 気になるところ + - 最初だけ別で処理しているのをやめたい + - + +## step2 + +## step3 + diff --git a/problems/206.reverse-linked-list/step1.py b/problems/206.reverse-linked-list/step1.py new file mode 100644 index 0000000..fe81b58 --- /dev/null +++ b/problems/206.reverse-linked-list/step1.py @@ -0,0 +1,40 @@ +# +# @lc app=leetcode id=206 lang=python3 +# +# [206] Reverse Linked List +# + +# @lc code=start +# 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]: + node_stack = [] + node = head + reversed_head = None + + while node: + node_stack.append(node) + node = node.next + + if node_stack: + reversed_head = node_stack.pop() + if node_stack: + reversed_head.next = node_stack[-1] + else: + reversed_head.next = None + + while node_stack: + node = node_stack.pop() + if node_stack: + node.next = node_stack[-1] + else: + node.next = None + + return reversed_head + + +# @lc code=end From 16a8d6a0b9f900c311dbf9186fb13e1e4073fb58 Mon Sep 17 00:00:00 2001 From: Masakuni Date: Thu, 1 Jan 2026 12:14:03 +0900 Subject: [PATCH 2/4] step1-2 --- problems/206.reverse-linked-list/memo.md | 2 +- problems/206.reverse-linked-list/step1.py | 10 +++------- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/problems/206.reverse-linked-list/memo.md b/problems/206.reverse-linked-list/memo.md index e4b88aa..357ad5b 100644 --- a/problems/206.reverse-linked-list/memo.md +++ b/problems/206.reverse-linked-list/memo.md @@ -10,7 +10,7 @@ - popしてnextをstack[-1]にしていき、最後はnextをNoneにする - 気になるところ - 最初だけ別で処理しているのをやめたい - - + - reversed_headがNoneの時(whileの初回)に最後にreversed_head = nodeにすればいいことに気づいた ## step2 diff --git a/problems/206.reverse-linked-list/step1.py b/problems/206.reverse-linked-list/step1.py index fe81b58..c87d351 100644 --- a/problems/206.reverse-linked-list/step1.py +++ b/problems/206.reverse-linked-list/step1.py @@ -20,13 +20,6 @@ def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: node_stack.append(node) node = node.next - if node_stack: - reversed_head = node_stack.pop() - if node_stack: - reversed_head.next = node_stack[-1] - else: - reversed_head.next = None - while node_stack: node = node_stack.pop() if node_stack: @@ -34,6 +27,9 @@ def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: else: node.next = None + if reversed_head is None: + reversed_head = node + return reversed_head From b21d41941df7cec156265ec9b25980caa0fc6198 Mon Sep 17 00:00:00 2001 From: Masakuni Date: Thu, 1 Jan 2026 13:36:52 +0900 Subject: [PATCH 3/4] step2 --- problems/206.reverse-linked-list/memo.md | 35 +++++++++++++++++++++-- problems/206.reverse-linked-list/step2.py | 32 +++++++++++++++++++++ 2 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 problems/206.reverse-linked-list/step2.py diff --git a/problems/206.reverse-linked-list/memo.md b/problems/206.reverse-linked-list/memo.md index 357ad5b..3acc161 100644 --- a/problems/206.reverse-linked-list/memo.md +++ b/problems/206.reverse-linked-list/memo.md @@ -13,6 +13,37 @@ - reversed_headがNoneの時(whileの初回)に最後にreversed_head = nodeにすればいいことに気づいた ## step2 - +- stackに入れている時に書き換えちゃったらいいのでは!!!!! + - 頭で整理できておらず、思ったよりすんなり書けない + - 1. nodeをstackにいれる + - 2. 元々stackが空の時、入れたnodeのnextはNone,それ以外は入れたnodeのnextはstackの末尾 + - ここで調査対象のnodeを書き換えてるのでうまくいっていない + - 書き換えずにうまいことするのはちょっと大変か?(他の人のコード例みて確認する) + - なので新しいListNode(node.val)を定義すればうまくいく + - 元のNodeを書き換える場合はメモリ効率が高い + - 最後にstackの末尾を答える +- 時間計算量: O(n) +- 空間計算量: O(n) ほんとはO(1)にできそう +- 他の人のコードを読んでるが、読みにくいというか入ってこない +- nodeの挙動と変数の使い方でどこまで影響を与えているのかをイメージするのにかなり脳のリソースを割かれているからな気がする +- https://github.com/Hiroto-Iizuka/coding_practice/pull/7/files + - dummyの使い方がいいと思った + - 最後元がNoneかどうかで場合分けするのできればやめたかったから + - ただコードが簡潔になるというだけで、処理のわかりやすさ的には場合分けしてた方が良いのかも + - `一応、この問題の出題意図は、LinkedList でお手玉ができますかということかと思うので、これは出題意図には沿っていないだろうと推測します。`解いてみて感じたが、こういうことだろうと思うので新しいListNodeを定義するのは良くないかも(気をつけないといけない感覚があるのは伝わるかもだが) +- https://github.com/tNita/arai60/pull/8/files + - `スタックとして使うのであれば list で十分だと思います。一般に、同じ目的に使えるデータ構造が複数ある場合、その中で一番実装が軽いものを選ぶことが多いように思います。` + - dequeをstackとして使う人がいるなとは思っていたが、どっちでもいいなら書く量が少ない普通のlist派だった + - deque派の意見が聞きたいところ +- https://github.com/mamo3gr/arai60/pull/7/files + - step1でこんな感じに書けるようになりたいが、実装できなかった + - forwardに次の処理対象のnodeを取っておく + - 現在の処理対象のnodeのnextを一つ前の(処理済みの)node(previous)に変える + - 現在の処理済みのnodeを次のloopのために取っておく(previous) + - 次のloopのためにnodeにforwardを入れる + - 最初から処理する方の再帰と再帰でcallStackに積んで(言葉があっているかは怪しい)積み終わったのちに順々に処理しているように見える + - `関数は基本的に中を読みたくないのです。`なので関数名が長く説明的でも良いみたい + - headがNoneの時は一番最初にNoneを返した方が最後で場合分けするより実装時に考慮事項が減り楽出し、読んでる時にもListNodeが入っている前提で読めるのでわかりやすい +- 頭がこんがらがっているので問題をお気に入りしておき再帰はまた今後やる ## step3 - +- diff --git a/problems/206.reverse-linked-list/step2.py b/problems/206.reverse-linked-list/step2.py new file mode 100644 index 0000000..97b76a2 --- /dev/null +++ b/problems/206.reverse-linked-list/step2.py @@ -0,0 +1,32 @@ +# +# @lc app=leetcode id=206 lang=python3 +# +# [206] Reverse Linked List +# + +# @lc code=start +# 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]: + node = head + previous = None + + while node: + # 元々のnextをforwardに保持しておく + forward = node.next + # 現在の処理対象のnodeのnextを一つ前の処理ずみのnodeに変更 + node.next = previous + # 現在処理したnodeを次のloopのために保持 + previous = node + # 保持していたnextを戻す + node = forward + + # 最後に処理ずみのnodeがpreviousに入っているのでpreviousを返す + return previous + + +# @lc code=end From f0da0a24a6aed0e8bf5726661075beb25e984014 Mon Sep 17 00:00:00 2001 From: Masakuni Date: Thu, 1 Jan 2026 13:42:29 +0900 Subject: [PATCH 4/4] step3 --- problems/206.reverse-linked-list/memo.md | 2 +- problems/206.reverse-linked-list/step3.py | 27 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 problems/206.reverse-linked-list/step3.py diff --git a/problems/206.reverse-linked-list/memo.md b/problems/206.reverse-linked-list/memo.md index 3acc161..e82d8b6 100644 --- a/problems/206.reverse-linked-list/memo.md +++ b/problems/206.reverse-linked-list/memo.md @@ -46,4 +46,4 @@ - headがNoneの時は一番最初にNoneを返した方が最後で場合分けするより実装時に考慮事項が減り楽出し、読んでる時にもListNodeが入っている前提で読めるのでわかりやすい - 頭がこんがらがっているので問題をお気に入りしておき再帰はまた今後やる ## step3 -- +-  一回理解をして、処理をイメージできさえすれば実装は必然的にこうなる感みたいなのがあるが、自分で思いつけないなとも思う diff --git a/problems/206.reverse-linked-list/step3.py b/problems/206.reverse-linked-list/step3.py new file mode 100644 index 0000000..77cc670 --- /dev/null +++ b/problems/206.reverse-linked-list/step3.py @@ -0,0 +1,27 @@ +# +# @lc app=leetcode id=206 lang=python3 +# +# [206] Reverse Linked List +# + +# @lc code=start +# 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]: + node = head + previous = None + + while node: + forward = node.next + node.next = previous + previous = node + node = forward + + return previous + + +# @lc code=end