From 714d6aaab32948f91528c574ef676b4cf1b39ce1 Mon Sep 17 00:00:00 2001 From: parth Date: Mon, 2 Oct 2023 01:00:19 +0530 Subject: [PATCH 1/2] reverse linked list of groups of given size --- .../reverse_in_group_of_given_size.py | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 data_structures/linked_list/reverse_in_group_of_given_size.py diff --git a/data_structures/linked_list/reverse_in_group_of_given_size.py b/data_structures/linked_list/reverse_in_group_of_given_size.py new file mode 100644 index 000000000000..3df2e27addd3 --- /dev/null +++ b/data_structures/linked_list/reverse_in_group_of_given_size.py @@ -0,0 +1,126 @@ +from __future__ import annotations + +from dataclasses import dataclass + + +@dataclass +class Node: + data: int + nextt: Node | None = None + + +def insert_node(head: Node | None, data: int) -> Node: + """ + Insert a new node at the end of a linked list and return the new head. + >>> head = insert_node(None, 1) + >>> head = insert_node(head, 2) + >>> head = insert_node(head, 3) + >>> print_linked_list(head) + 1->2->3 + """ + new_node = Node(data) + # If the linked list is empty, the new_node becomes the head + if head is None: + return new_node + + temp_node = head + while temp_node.nextt is not None: + temp_node = temp_node.nextt + + temp_node.nextt = new_node # type: ignore + return head + + +def length_of_linked_list(head: Node | None) -> int: + """ + find length of linked list + >>> head = insert_node(None, 10) + >>> head = insert_node(head, 9) + >>> head = insert_node(head, 8) + >>> length_of_linked_list(head) + 3 + """ + length = 0 + while head is not None: + length += 1 + head = head.nextt + return length + + +def print_linked_list(head: Node | None) -> None: + """ + print the entire linked list + >>> head = insert_node(None, 1) + >>> head = insert_node(head, 2) + >>> head = insert_node(head, 3) + >>> print_linked_list(head) + 1->2->3 + """ + if head is not None: + while head.nextt is not None: + print(head.data, end="->") + head = head.nextt + print(head.data) + + +def reverse_k_nodes(head: Node | None, k: int) -> Node | None: + """ + reverse nodes within groups of size k + >>> k = 3 + >>> head = insert_node(None, 1) + >>> head = insert_node(head, 2) + >>> head = insert_node(head, 3) + >>> head = insert_node(head, 4) + >>> head = insert_node(head, 5) + >>> new_head = reverse_k_nodes(head, 2) + >>> print_linked_list(new_head) + 2->1->4->3->5 + """ + if head is None or head.nextt is None: + return head + + length = length_of_linked_list(head) + + dummy_head = Node(0) + dummy_head.nextt = head + + previous_node = dummy_head + + while length >= k: + assert previous_node + current_node = previous_node.nextt + assert current_node + next_node = current_node.nextt + for _ in range(1, k): + assert next_node, current_node + current_node.nextt = next_node.nextt + assert previous_node + next_node.nextt = previous_node.nextt + assert previous_node + previous_node.nextt = next_node + assert current_node + next_node = current_node.nextt + previous_node = current_node + length -= k + assert dummy_head + return dummy_head.nextt + + +if __name__ == "__main__": + from doctest import testmod + + testmod() + + k = 2 + head = insert_node(None, 1) + head = insert_node(head, 2) + head = insert_node(head, 3) + head = insert_node(head, 4) + head = insert_node(head, 5) + + print("Original Linked List: ", end="") + print_linked_list(head) + print("After Reversal of k nodes: ", end="") + new_head = reverse_k_nodes(head, k) + print_linked_list(new_head) + print() From 4c0207e2ffed774e08eafbcfd1435d71ff21ac7d Mon Sep 17 00:00:00 2001 From: parth Date: Mon, 2 Oct 2023 01:09:18 +0530 Subject: [PATCH 2/2] minor changes as suggested --- .../linked_list/reverse_in_group_of_given_size.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/data_structures/linked_list/reverse_in_group_of_given_size.py b/data_structures/linked_list/reverse_in_group_of_given_size.py index 3df2e27addd3..468421ebd012 100644 --- a/data_structures/linked_list/reverse_in_group_of_given_size.py +++ b/data_structures/linked_list/reverse_in_group_of_given_size.py @@ -63,10 +63,9 @@ def print_linked_list(head: Node | None) -> None: print(head.data) -def reverse_k_nodes(head: Node | None, k: int) -> Node | None: +def reverse_k_nodes(head: Node | None, group_size: int) -> Node | None: """ reverse nodes within groups of size k - >>> k = 3 >>> head = insert_node(None, 1) >>> head = insert_node(head, 2) >>> head = insert_node(head, 3) @@ -86,12 +85,12 @@ def reverse_k_nodes(head: Node | None, k: int) -> Node | None: previous_node = dummy_head - while length >= k: + while length >= group_size: assert previous_node current_node = previous_node.nextt assert current_node next_node = current_node.nextt - for _ in range(1, k): + for _ in range(1, group_size): assert next_node, current_node current_node.nextt = next_node.nextt assert previous_node @@ -101,7 +100,7 @@ def reverse_k_nodes(head: Node | None, k: int) -> Node | None: assert current_node next_node = current_node.nextt previous_node = current_node - length -= k + length -= group_size assert dummy_head return dummy_head.nextt