From ce71adaf6bce4cde9c5f14955a2e179343231461 Mon Sep 17 00:00:00 2001 From: Manish Date: Mon, 6 Mar 2023 18:57:44 +1100 Subject: [PATCH] Design Pattern 7: In-place Reversal of a LinkedList | Problem: Reverse every K-element Sub-list --- 7_reverse_nodes_in_k_group.cpp | 82 ++++++++++++++++++++++++++++++++++ CMakeLists.txt | 2 + 2 files changed, 84 insertions(+) create mode 100644 7_reverse_nodes_in_k_group.cpp diff --git a/7_reverse_nodes_in_k_group.cpp b/7_reverse_nodes_in_k_group.cpp new file mode 100644 index 0000000..b63f3f6 --- /dev/null +++ b/7_reverse_nodes_in_k_group.cpp @@ -0,0 +1,82 @@ +/* Problem: https://leetcode.com/problems/reverse-nodes-in-k-group/ + */ + +#include +#include + +// Below ListNode definition is copied form problem +struct ListNode { + int val; + ListNode *next; + ListNode() : val(0), next(nullptr) {} + ListNode(int x) : val(x), next(nullptr) {} + ListNode(int x, ListNode *next) : val(x), next(next) {} +}; +// Above ListNode definition is copied from problem + +std::ostream &operator<<(std::ostream &out, ListNode *node) { + out << "{"; + while (node != nullptr) { + out << node->val << ", "; + node = node->next; + } + out << "}"; + return out; + ; +} + +ListNode *solution(ListNode *node, int k) { + if (k == 1) + return node; + ListNode *previous_group_last_node = nullptr, *current_node = node, + *head = node; + while (current_node != nullptr) { + ListNode *current_group_first_node = current_node; + int group_nodes_count; + for (group_nodes_count = 1; group_nodes_count < k; group_nodes_count++) { + if (current_node->next == nullptr) { + break; + } + current_node = current_node->next; + } + if (group_nodes_count == k) { + ListNode *current_group_last_node = current_node, + *next_group_first_node = current_node->next, + *left = current_group_first_node, *right = left->next; + if (head == node) { + head = current_group_last_node; + } + while (right != next_group_first_node) { + ListNode *tmp = right->next; + right->next = left; + left = right; + right = tmp; + } + if (previous_group_last_node != nullptr) { + previous_group_last_node->next = current_group_last_node; + } + previous_group_last_node = current_group_first_node; + current_group_first_node->next = next_group_first_node; + current_node = next_group_first_node; + } else { + break; + } + } + return head; +} + +ListNode *vector_to_list(std::vector &&vec) { + ListNode *head = nullptr; + for (int i = vec.size() - 1; i >= 0; i--) { + head = new ListNode(vec[i], head); + } + return head; +} + +int main() { + std::cout << solution(vector_to_list({1, 2, 3, 4, 5}), 2) << std::endl + << solution(vector_to_list({1, 2, 3, 4, 5}), 3) << std::endl + << solution(vector_to_list({1, 2, 3, 4, 5}), 4) << std::endl; + ; + return 0; +} \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 4ed78ad..9d9b40a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,3 +16,5 @@ add_executable(3_squares_of_a_sorted_array 3_squares_of_a_sorted_array.cpp) add_executable(5_conflicting_appointments 5_conflicting_appointments.cpp) add_executable(6_find_all_missing_numbers 6_find_all_missing_numbers.cpp) + +add_executable(7_reverse_nodes_in_k_group 7_reverse_nodes_in_k_group.cpp)