Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions NeetCode/reverse-nodes-in-k-group/step1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
"""
Problem:
separate list and each length is k
reverse each segment
Question:
Discussion:
define function to reverse segment
def reverse_segment(head, length)

kthを取ってくることで、dummy.nextを正しく設定できている
"""
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
def reverse_list(head):
cur = head
prev = None
count = 0
while count < k:
tmp = cur.next
cur.next = prev
prev = cur
cur = tmp
count += 1
return prev, cur

length = 0
cur = head
while cur:
length += 1
cur = cur.next
count = 0
prev_group_final = ListNode(next=head)
group_final = head
while length - count >= k:
tmp, group_next = reverse_list(group_final)
group_final.next = group_next
group_final = group_next
prev_group_final.next = tmp
count += k
return dummy.next
"""
これだと、dummy.nextが設定できない。reverseされたgroupのheadを持っていないから
dummy自体のポジションも動かしにくい。
"""

# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
def get_kth(head):
count = 0
while head and count < k:
head = head.next
count += 1
return head

dummy = ListNode(next=head)
group_prev = dummy
while True:
kth = get_kth(group_prev)
if not kth:
break
group_next = kth.next

prev = group_next
cur = group_prev.next
while cur != group_next:
tmp = cur.next
cur.next = prev
prev = cur
cur = tmp

tmp = group_prev.next
group_prev.next = kth
group_prev = tmp
return dummy.next
34 changes: 34 additions & 0 deletions NeetCode/reverse-nodes-in-k-group/step3.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
def get_kth(head):
count = 0
while head and count < k:
head = head.next
count += 1
return head

dummy = ListNode(next=head)
group_prev = dummy
while True:
kth = get_kth(group_prev)
if not kth:
break
group_next = kth.next

cur = group_prev.next
prev = group_next
while cur != group_next:
tmp = cur.next
cur.next = prev
prev = cur
cur = tmp

tmp = group_prev.next
group_prev.next = prev
group_prev = tmp
return dummy.next