Skip to content

Commit 86034da

Browse files
committed
[Feature] Reversing Linked Lists iteratively and recursively!
1 parent d67cecb commit 86034da

File tree

2 files changed

+52
-3
lines changed

2 files changed

+52
-3
lines changed

structures/linked_list.py

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,33 @@ def get_beginning_of_cycle_if_exists(self):
3939
slow_pointer = self
4040
# move the pointers again at same speed, will meet at start
4141
while slow_pointer is not fast_pointer:
42-
print(slow_pointer.val, fast_pointer.val)
42+
# print(slow_pointer.val, fast_pointer.val)
4343
slow_pointer = slow_pointer.next
4444
fast_pointer = fast_pointer.next
4545

46-
return slow_pointer
46+
return slow_pointer
47+
48+
def reverse(self):
49+
prev = None
50+
head = self
51+
while head.next:
52+
next_node = head.next
53+
head.next = prev
54+
prev = head
55+
head = next_node
56+
head.next = prev
57+
return head
58+
59+
def reverse_recursive(self):
60+
def rev(node):
61+
if not node.next:
62+
rev.head = node
63+
return
64+
rev(node.next)
65+
temp = node.next
66+
temp.next = node
67+
node.next = None
68+
rev.head = self
69+
rev(self)
70+
71+
return rev.head

tests/test_linked_list.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,28 @@ def test_ll_get_cycle_start_no_cycle(self):
5353
self.assertEqual(None, head.get_beginning_of_cycle_if_exists())
5454

5555
def test_ll_get_cycle_start_on_single_node(self):
56-
self.assertEqual(None, ListNode(1).get_beginning_of_cycle_if_exists())
56+
self.assertEqual(None, ListNode(1).get_beginning_of_cycle_if_exists())
57+
58+
def test_reverse(self):
59+
head = ListNode(1)
60+
head.next = ListNode(2)
61+
head.next.next = ListNode(3)
62+
self.assertEqual(1, head.val)
63+
self.assertEqual(2, head.next.val)
64+
self.assertEqual(3, head.next.next.val)
65+
head = head.reverse()
66+
self.assertEqual(3, head.val)
67+
self.assertEqual(2, head.next.val)
68+
self.assertEqual(1, head.next.next.val)
69+
70+
def test_reverse_recursive(self):
71+
head = ListNode(1)
72+
head.next = ListNode(2)
73+
head.next.next = ListNode(3)
74+
self.assertEqual(1, head.val)
75+
self.assertEqual(2, head.next.val)
76+
self.assertEqual(3, head.next.next.val)
77+
head = head.reverse_recursive()
78+
self.assertEqual(3, head.val)
79+
self.assertEqual(2, head.next.val)
80+
self.assertEqual(1, head.next.next.val)

0 commit comments

Comments
 (0)