Skip to content

Commit 2742840

Browse files
committed
Add problem 25 - Reverse Nodes In K Group
1 parent d5de2aa commit 2742840

File tree

2 files changed

+102
-0
lines changed

2 files changed

+102
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
from typing import Optional
2+
3+
from problems.util.list_node import ListNode
4+
5+
6+
class ReverseNodesInKGroup:
7+
@staticmethod
8+
def reverseKGroup(head: Optional[ListNode], k: int) -> Optional[ListNode]:
9+
# Special case
10+
if head is None or k <= 0:
11+
return head
12+
# Dummy head
13+
dummy = ListNode()
14+
dummy.next = head
15+
# Pointer to traverse the list
16+
temp = dummy
17+
# Traverse the list
18+
while True:
19+
current_temp = temp
20+
# Check if we have k nodes to reverse
21+
index = 0
22+
while index < k and current_temp is not None:
23+
current_temp = current_temp.next
24+
index += 1
25+
if current_temp is None:
26+
break
27+
# Reverse the list
28+
previous_node, current_node, next_node = None, temp.next, None
29+
for i in range(k):
30+
next_node = current_node.next
31+
current_node.next = previous_node
32+
previous_node = current_node
33+
current_node = next_node
34+
# Tail of the group
35+
tail = temp.next
36+
tail.next = current_node
37+
temp.next = previous_node
38+
temp = tail
39+
return dummy.next
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import unittest
2+
3+
from problems.linked_list.reverse_nodes_in_k_group import ReverseNodesInKGroup
4+
from problems.util.list_node import ListNode
5+
6+
7+
class ReverseNodesInKGroupTest(unittest.TestCase):
8+
9+
@staticmethod
10+
def create_list(values):
11+
dummy = ListNode()
12+
current = dummy
13+
for value in values:
14+
current.next = ListNode(value)
15+
current = current.next
16+
return dummy.next
17+
18+
@staticmethod
19+
def list_to_array(head):
20+
result = []
21+
current = head
22+
while current is not None:
23+
result.append(current.val)
24+
current = current.next
25+
return result
26+
27+
def test_reverseKGroup_with_null_head(self):
28+
result = ReverseNodesInKGroup.reverseKGroup(None, 3)
29+
self.assertIsNone(result)
30+
31+
def test_reverseKGroup_with_k_less_than_or_equal_to_zero(self):
32+
head = self.create_list([1, 2, 3])
33+
result = ReverseNodesInKGroup.reverseKGroup(head, 0)
34+
self.assertEqual(self.list_to_array(result), [1, 2, 3])
35+
36+
def test_reverseKGroup_with_single_element(self):
37+
head = self.create_list([1])
38+
result = ReverseNodesInKGroup.reverseKGroup(head, 1)
39+
self.assertEqual(self.list_to_array(result), [1])
40+
41+
def test_reverseKGroup_with_k_greater_than_list_length(self):
42+
head = self.create_list([1, 2, 3])
43+
result = ReverseNodesInKGroup.reverseKGroup(head, 4)
44+
self.assertEqual(self.list_to_array(result), [1, 2, 3])
45+
46+
def test_reverseKGroup_with_k_equals_list_length(self):
47+
head = self.create_list([1, 2, 3])
48+
result = ReverseNodesInKGroup.reverseKGroup(head, 3)
49+
self.assertEqual(self.list_to_array(result), [3, 2, 1])
50+
51+
def test_reverseKGroup_with_multiple_k_groups(self):
52+
head = self.create_list([1, 2, 3, 4, 5])
53+
result = ReverseNodesInKGroup.reverseKGroup(head, 2)
54+
self.assertEqual(self.list_to_array(result), [2, 1, 4, 3, 5])
55+
56+
def test_reverseKGroup_with_remaining_nodes_less_than_k(self):
57+
head = self.create_list([1, 2, 3, 4, 5])
58+
result = ReverseNodesInKGroup.reverseKGroup(head, 3)
59+
self.assertEqual(self.list_to_array(result), [3, 2, 1, 4, 5])
60+
61+
62+
if __name__ == '__main__':
63+
unittest.main()

0 commit comments

Comments
 (0)