diff --git a/Reverse Linked List/memo.md b/Reverse Linked List/memo.md new file mode 100644 index 0000000..d03aaf7 --- /dev/null +++ b/Reverse Linked List/memo.md @@ -0,0 +1,31 @@ +# step1 + +ループ処理の最中でノードを反転させていく方法が一番最初に思いついた。(というか、多分やったことがあって記憶にあった) +2分くらいで手順を書き出して、それをコード化することができた。 + +# step2 + +ループでのアプローチ以外に +- 再帰 +- スタック +があることを知った。 + +## 再帰について + +今回再帰でコード書いてみると通りはするけど、実際にノードの連結数に明記がないので不適。(LeetCodeの環境なら大丈夫なコードになってしまうから) + +時間計算量はO(N), 空間計算量はO(N) + +## スタック + +アプローチはとても自然で他人が書いたコードでも読みやすいと思った。 +ただ空間計算量がO(N)になり、他のアプローチを考えるとデメリット。 + +時間計算量はO(N), 空間計算量はO(N) + +## step3 + +AIもつかってリファクタリングをした。 +再帰はベースケースとエッジケースを最初に明記して後続の処理をよりシンプルに書くように変更 + + 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 + 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 + 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 + 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 + 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 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 + 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 + 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 + 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 + 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